Swift 4.1 协议的类型限定功能

Swift 4.1 协议的类型限定功能,第1张

概述我们知道协议在Swift里可是个不可或缺的角色. 我们不但可以控制协议的”外观”,还可以限制遵守(conform)方的类型.比如我们希望协议只能被类遵守,我们可以这么写: //协议FooDelegate只能被类遵守protocol FooDelegate:class{} 或者这么写也可以: protocol FooDelegate:AnyObject{ } 有了上面的限制,如果你用结构或枚举去

我们知道协议在Swift里可是个不可或缺的角色.

我们不但可以控制协议的”外观”,还可以限制遵守(conform)方的类型.比如我们希望协议只能被类遵守,我们可以这么写:

//协议FooDelegate只能被类遵守protocol FooDelegate:class{}

或者这么写也可以:

protocol FooDelegate:AnyObject{ }

有了上面的限制,如果你用结构或枚举去遵守FooDelegate就会编译不过去:

那么更进一步,如果我还想限制遵守的类为特定的类呢?比如我只允许UItableVIEwController类去遵守FooDelegate,可以么?

在Swift 4.1中,支持这种限制,我们需要这么写:

protocol FooDelegate where Self: UItableVIEwController { }

如上,现在FooDelegate只能被UItableVIEwController遵守.

不过值得说明的是,上面只是一个约束而非实际的”推断(infer)”,也就是说在FooDelegate的外面是无法推测出其被UItableVIEwController遵守的,不信?请看如下代码:

class Form{    var delegate:FooDelegate!    func invoke(){        delegate.tableVIEw.reloadData() //Error!!!    }}

因为delegate属性遵守FooDelegate,而FooDelegate定义中规定了其必须”是一个”UItableVIEwController,按道理来说其必包含tableVIEw属性,但世界上编译器根本不认账.

如果想实现如上功能,我们只有手动添加属性接口:

protocol FooDelegate where Self: UItableVIEwController {    var tableVIEw:UItableVIEw {get}}

但是话又说回来,在FooDelegate内部还是可以使用UItableVIEwController的接口内容的.

把上面在FooDelegate内部声明的tableVIEw属性删除,然后写一个协议扩展:

extension FooDelegate {    func display(){        self.tableVIEw.reloadData()   //That's OK!!!    }}

至少在当前的Swift 4.1中还不能在协议外面根据其约束去推断其被遵守的类型,让我们期待一下吧 ;)

总结

以上是内存溢出为你收集整理的Swift 4.1 协议的类型限定功能全部内容,希望文章能够帮你解决Swift 4.1 协议的类型限定功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1054613.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存