微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐