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()

变换不同代码得到的执行结果总结

情况编号 协议中声明方法 协议扩展中默认实现 遵循协议类中重写 实验属性遵循协议(转换上下文) 执行方法结果方法
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

重写协议扩展中定义的方法,协议扩展的静态特性保留了方法的原版盒被重写版本,你可以通过切换上下文获得不同的版本,同时对于没有重写的方法,可以保证其不变性。

我们可以遵循一个原则,把那些希望被重写的方法定义在协议中,那些不希望被复写的方法的定义和实现放在协议扩展中。

发布了139 篇原创文章 · 获赞 35 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/wxs0124/article/details/73742465