美文网首页
Swift 中同时声明继承和协议

Swift 中同时声明继承和协议

作者: 水果宾治武士 | 来源:发表于2017-06-04 21:22 被阅读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的坏习惯(也许是)吧。

    相关文章

      网友评论

          本文标题:Swift 中同时声明继承和协议

          本文链接:https://www.haomeiwen.com/subject/nvjbfxtx.html