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中还不能在协议外面根据其约束去推断其被遵守的类型,让我们期待一下吧 ?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值