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
网友评论