前端之家收集整理的这篇文章主要介绍了
Swift 关于Protocol扩展的静态特性,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
//声明一个协议
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()
变换不同代码得到的执行结果总结
@H_403_61@情况编号
@H_403_61@协议中声明方法
@H_403_61@协议扩展中默认实现
@H_403_61@遵循协议类中重写
@H_403_61@实验属性遵循协议(转换上下文)
@H_403_61@执行方法结果方法
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 |
@H_512_301@
重写协议扩展中定义的方法,协议扩展的静态特性保留了方法的原版盒被重写版本,你可以通过切换上下文获得不同的版本,同时对于没有重写的方法,可以保证其不变性。
我们可以遵循一个原则,把那些希望被重写的方法定义在协议中,那些不希望被复写的方法的定义和实现放在协议扩展中。