实验样本代码
//声明一个协议
protocol SharedString {
func methodForOverride() -> Void
func methodWithoutOverride() -> Void
}
//扩展协议,实现默认实现
//注意方法methodWithoutOverride 中调用了 methodForOverride 方法,这里有一个上写文切换的问题
extension SharedString {
func methodForOverride() -> Void {
print("��")
}
func methodWithoutOverride() -> Void {
print("��")
methodForOverride()
print("��")
}
}
//在String类的扩展中遵守并实现协议
extension String:SharedString {
func methodForOverride() -> Void {
print(self)
}
}
//创建字符串并切换上下文到SharedString协议
let Shared:SharedString = "hello"
Shared.methodForOverride()
Shared.methodWithoutOverride()
变换不同代码得到的执行结果总结
情况编号 | 协议中声明方法 | 协议扩展中默认实现 | 遵循协议类中重写 | 实验属性遵循协议(转换上下文) | 执行方法结果方法 |
---|---|---|---|---|---|
1 | YES | NO | YES | NO | 遵循协议类中重写的方法 |
2 | YES | YES | YES | YES | 遵循协议类中重写的方法 |
3 | YES | NO | YES | YES | 遵循协议类中重写的方法 |
4 | NO | NO | YES | NO | 遵循协议类中重写的方法 |
5 | YES | YES | YES | NO | 遵循协议类中重写的方法 |
6 | NO | YES | NO | YES | 协议扩展中的默认实现 |
7 | NO | YES | NO | NO | 协议扩展中的默认实现 |
8 | YES | YES | NO | YES | 协议扩展中的默认实现 |
9 | YES | YES | NO | NO | 协议扩展中的默认实现 |
10 | NO | YES | YES | YES | 协议扩展中的默认实现 |
11 | NO | YES | YES | NO | 方法1、2都是协议扩展中的方法。方法1,在遵循类中被重写,调用方法1,是遵循协议类中重写的方法。方法2没有被重写,但是在协议中方法2调用了方法1,这时,方法2调用时方法1依旧是协议扩展中的默认实现 |
12 | NO | NO | YES | YES | ERROR |
13 | NO | NO | NO | YES | ERROR |
14 | NO | NO | NO | NO | ERROR |
15 | YES | NO | NO | NO | ERROR |
16 | YES | NO | NO | YES | EROOR |
重写协议扩展中定义的方法,协议扩展的静态特性保留了方法的原版盒被重写版本,你可以通过切换上下文获得不同的版本,同时对于没有重写的方法,可以保证其不变性。
我们可以遵循一个原则,把那些希望被重写的方法定义在协议中,那些不希望被复写的方法的定义和实现放在协议扩展中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。