Protocol 的使用在 Swift 的世界里变得简单而复杂
定义一个 protocol 是这样的
protocol XXX {
func hello()
}
使用一个 Protocol 创建一个类是这样的
class XXXObject: XXX {
func hello() { }
}
但是,如果你需要在一个 delegate 属性中声明它属于哪一个 Protocol, 是不行的,必须指定一个类作为类型。
class YYY {
weak var delegate: XXX? // 编译器报错,不能这样定义
}
所有的 Protocol 类都继承 XXXObject 就可以了
class YYY {
weak var delegate: XXXObject? // 换成这样就好了
}
但我仍然觉得是一个坑,一个类理论上应该可以遵丛多个协议,所以,一旦离开了 NSObject, 这也就变成一个坑。
回到 NSObject 的世界,Protocol的可读性就变得高起来了
protocol XXX: NSObjectProtocol {
func hello()
}
class XXXObject: NSObject, XXX {
func hello() { }
}
class YYY {
weak var delegate: XXX?
}
同时 Protocol 也可以支持 Optional call 了
@objc protocol XXX: NSObjectProtocol {
optional
func hello()
}
class XXXObject: NSObject, XXX {
func hello() { }
}
class YYY {
weak var delegate: XXX?
func call() {
if let helloFunc = delegate?.hello {
helloFunc()
}
}
}