Swift 中同时声明继承和协议

2017-06-04  本文已影响105人  水果宾治武士

以前写OC的时候经常会有这样一种写法:

UIViewController <SomeDelegate>* obj;

这样声明的一个obj, 意味着它继承了UIViewController, 同时还实现了SomeDelegate。
但在Swift里面,就显得不那么友好了,因为Swift是没有办法声明一个变量同时继承某个类和实现某个协议的。最接近的形式是组合协议,比如swift 3.0里面

var vc:UITableViewDelegate & UITableViewDataSource

声明的vc同时实现UITableViewDelegate 和 UITableViewDataSource 两个协议。

let vc:UIViewController & UITableViewDataSource

显然,这是编译不过的。

在网上找了很久,发现这个问题的答案貌似暂时还是无解。

stackoverflow上也有相关的讨论:
https://stackoverflow.com/questions/35452785/swift-protocol-of-a-particular-class

里面给出的答案是声明两个变量,一个作为子类声明,一个作为协议声明,然后在赋值函数里面用泛型做好限制。作为一个不对外暴露的属性,这样做勉强还可以,就是太复杂了。

不过细想一下,也许是因为Swift本身的设计思想是鼓励面向协议编程,所以不希望出现这种同时声明继承和协议的情况出现。所以最终的思路还是建议在程序实现上使用纯粹的面向协议的方式,放弃这个ObjC的坏习惯(也许是)吧。

上一篇下一篇

猜你喜欢

热点阅读