Swift 4.1 协议的类型限定功能
我们知道协议在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中还不能在协议外面根据其约束去推断其被遵守的类型,让我们期待一下吧 ;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |