Swift协议

关键词:Swift, iOS, 协议, protocol, @objc

概述

  • 协议可以要求遵循协议的类型提供特定名称和类型的实例属性或类型属性。
  • 协议只指定属性的名称和类型,不指定属性是存储属性还是计算属性。
  • 协议可以指定属性是只读的还是可读可写的。
  • 协议可以被继承。
  • 协议可以扩展,并提供默认实现。

指定属性的读写性

  • 只读:在属性类型后面添加{get}
  • 可读可写:在属性类型后面添加{set get}

协议作为类型的使用场景

协议也是一种类型,可以像其他普通类型一样使用,使用场景:

  • 作为函数、方法或构造器中的参数类型或返回值类型
  • 作为常量、变量或属性的类型
  • 作为数组、字典或其他容器中的元素类型

示例

定义协议

protocol ExampleProtocol {
    //这是一个只读的实例属性
    var simpleStr : String { get }
    //这是一个可读写的类型属性
    static var simpleName: String {set get}
    mutating func simpleFunc()
}

类遵循协议

//类遵循协议
class SimpleClass : ExampleProtocol {
    var simpleStr: String = "类遵循的协议变量"
    static var simpleName: String = "类遵循的协议类型属性"
    func simpleFunc() {
        simpleStr += "-hehe"
        print("这是在类遵循的协议方法里面")
    }
}

结构体遵循协议

//结构体遵循协议
struct SimpleStruct : ExampleProtocol {
    var simpleStr: String = "结构体遵循的协议变量"
    static var simpleName: String = "结构体遵循的协议类型属性"
    mutating func simpleFunc() {
        simpleStr += "-haha"
        print("这是在结构体遵循的协议方法里面")
    }
    
}

给现有的类型添加功能

//给现有的类型添加一个协议
extension Int : ExampleProtocol {
    var simpleStr: String {
        return "这个数字是:\(self)"
    }
    static var simpleName: String = "这是一个类型属性"
    mutating func simpleFunc() {
        self += 10
        print("这是在类型遵循的协议方法里面")
    }
}

类专属的协议(只能给类使用的协议)

在协议的继承列表里添加AnyObject。

protocol SimpleProtocol: AnyObject {
    // 这里是类专属协议的定义部分
    var name:String {get}
}

可选的协议要求

  • @objc标识,用在需要和 Objective-C 打交道的代码中。
  • 协议和可选要求都必须带上 @objc 属性。
  • 只能被继承自 Objective-C 类的类或者 @objc 类遵循。
@objc protocol CounterDataSource {
    @objc optional func increment(forCount count: Int) -> Int
    @objc optional var fixedIncrement: Int { get }
}