Swift 协议的使用

//
//  Protocols.swift
//  SwiftCode
//
//  Created by Alisa on 2022/4/14.
//  Copyright © 2022 Alisa. All rights reserved.
//

import Foundation

/*
 
    协议:在语法上,协议中可以定义一些属性和方法,这些属性和方法只是声明,协议中并不能实现这些属性和方法。协议不是一种数据类型,没有
         构造方法,也不需要实例化
 
    swift中,协议使用protocol关键字创建,其中可以声明属性与方法,其中属性在具体实现时可以是计算属性,也可以是存储属性
 
    协议与扩展的联用:
        扩展可以为数据类型添加新的功能,通过扩展也可以为协议中约定的属性方法提供默认的实现。
        开发者可以为某个协议提供一个扩展,在扩展中为其约定的属性方法提供一套默认的实现,这样所有遵守此协议的数据类型都获取到了扩展中的默认实现
*/

protocol BookMarkProtocol{
    
    /* ** 定义属性 */
    //只读
    var bookColor:String { get }
    //可读可写
    var bookPages:Int {get set}
    //静态属性
    static var bookSize:(Int, Int){get set}
    
    /* ** 定义方法 */
    //实例方法
    func markLiteraryBooks()->Void
    //静态方法
    static func cleanBookMark()->Void
}

class Bookmark{
    
    var bookName:String
    var Bentence:String
    
    var color:String
    var pages:Int
    static var size:(Int, Int) = (20, 20)
    
    
    //协议属性
    //只读
    var bookColor:String{
        get{
            return self.color
        }
    }
    //可读可写
    var bookPages:Int{
        get{
            print("协议的实例计算属性,读取book的pages:\(self.pages)")
            return self.pages
        }
        set{
            print("协议的实例计算属性,设置book的pages:\(newValue)")
            self.pages = newValue
        }
    }
    //静态属性
    static var bookSize:(Int, Int){
        get{
            print("协议的静态计算属性,读取book的size:\(self.size)")
            return self.size
        }
        set{
            print("协议的静态计算属性,设置book的size:\(newValue)")
            self.size = newValue
        }
    }
    
    
    //协议方法
    //实例方法
    func markLiteraryBooks(){
        print("放入文学类书籍中的 book mark")
    }
    //静态方法
    static func cleanBookMark(){
        print("清理一下当前的 book mark")
    }
    
    init() {
        self.bookName = ""
        self.Bentence = ""
        
        //协议添加的属性
        self.color = ""
        self.pages = 0
    }
    
    deinit{
        print("Bookmark deinit")
    }
}

//协议与扩展的结合使用
@objc protocol ClassProcotol:AnyObject{
    //此协议方法可选择是否实现,即遵守协议的类可以实现,也可以不实现
    @objc optional func log()
}
//为ClassProtocol中的方法提供默认实现
extension ClassProcotol{
    func log(){
        print("show this log")
    }
}
class AirConditioner:ClassProcotol{
    
    //接受这个协议时,报了一个警告:Non-'@objc' method 'log()' does not satisfy optional requirement of '@objc' protocol 'ClassProcotol'
}

class Protocols{
    
    //使用协议中的实例属性与实例方法
    func useInstanceProtocols(){
        
        let mark = Bookmark()
        //设置协议中计算属性
        mark.bookPages = 22
        //设置属性
        mark.color = "blue"
        
        //读取协议中的计算属性
        let color = mark.bookColor
        let pages = mark.bookPages
        
        print("当前书籍的颜色:\(color), 当前书籍的页码数:\(pages)")
        
        //协议中的实例方法
        mark.markLiteraryBooks()
        
        /* 打印信息:
         协议的实例计算属性,设置book的pages:22
         协议的实例计算属性,读取book的pages:22
         当前书籍的颜色:blue, 当前书籍的页码数:22
         放入文学类书籍中的 book mark
         Bookmark deinit
        */
    }
    
    //使用协议中的静态属性与静态方法
    func useStaticProtocols(){
        
        //协议中的静态属性
        let size = Bookmark.bookSize
        print("size的标准尺寸:\(size)")
        
        //协议中的静态方法
        Bookmark.cleanBookMark()
        
        /* 打印信息
         size的标准尺寸:(20, 20)
         清理一下当前的 book mark
        */
    }
    
    //协议与扩展的结合使用
    func useExtensionProtocols(){
        
        let acd = AirConditioner()
        acd.log()   //show this log
        
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值