swift3 笔记 可选协议 和 协议扩展

Objective-C

可选协议 -> 非必须实现
  • 使用 @optional 关键字

Swift

可选协议
  • 第一种
    • 在 protocol 定义的前面和协议方法的前面加上 @objc。
@objc protocol OptionalProtocol {
            @objc optional func optionalMethod()
}

@objc protocol OptionalProtocol {
    @objc optional func optionalMethod()  // 可选
    func necessaryMethod()          // 必须
    @objc optional func anotherOptionalMethod() // 可选
}

使用 @objc 修饰 会出现的问题:

  • 此 protocol 只能被 class实现
  • struct 和 enum 类型 ,不能实现 协议中 含有的可选方法或者属性
  • class中的方法也必须被标注为 @objc,或整个类就是继承自 NSObject.

在 Swift 2.0 中,出现了第二种方法

protocol extension

  • 在声明一个 protocol 之后 , 在 用 extension 的方式 给 部分方法默认的实现。
  • 这样 这些方法在实际的类中就是可选实现的了。
protocol OptionalProtocol {
    func optionalMethod()        // 可选
    func necessaryMethod()       // 必须
    func anotherOptionalMethod() // 可选
}

extension OptionalProtocol {
    func optionalMethod() {
    print("Implemented in extension")
    }

    func anotherOptionalMethod() {
        print("Implemented in extension")
    }
}

class MyClass: OptionalProtocol {
    func necessaryMethod() {
        print("Implemented in Class3")
    }

    func optionalMethod() {
        print("Implemented in Class3")
    }
}

调用

let obj = MyClass()
obj.necessaryMethod() // Implemented in Class3
obj.optionalMethod()  // Implemented in Class3
obj.anotherOptionalMethod() // Implemented in extension

你可能感兴趣的:(swift3 笔记 可选协议 和 协议扩展)