Swift 协议编程全解析
1. 协议扩展与方法调用机制
在 Swift 中,协议扩展方法的调用机制有时会带来意想不到的结果。例如,当我们有如下代码:
return "Tschüss"
}
再次运行代码,新方法会被调用并输出 “Tschüss”。但如果将 greeter 的声明改为使用协议:
let greeter: Greetable = GermanGreeter()
greet 方法仍输出 “Hallo”,而 leave 方法却输出 “Goodbye”。这是因为 Swift 似乎完全绕过了结构体中声明的函数,而调用了协议扩展中的函数。
实际上,扩展方法完全依赖于静态调度。在调用 leave 方法时,没有涉及到表,Swift 直接在变量的类型上静态调用该方法。而 greet 方法按预期工作,是因为将其添加到协议要求中后,强制 Swift 为该方法创建了协议见证表条目,从而启用了动态调度。
需要注意的是,在 Swift 中向协议添加扩展方法很常见,这是为结构体和类添加额外可重用功能的好方法。但如果想重写扩展方法,必须将其作为协议要求添加,否则可能会得到意外结果。
2. 协议与类型系统
2.1 存在类型(Existentials)
超级会员免费看
订阅专栏 解锁全文
1120

被折叠的 条评论
为什么被折叠?



