Swift 中同時聲明繼承和協(xié)議

以前寫OC的時候經(jīng)常會有這樣一種寫法:

UIViewController <SomeDelegate>* obj;

這樣聲明的一個obj, 意味著它繼承了UIViewController, 同時還實現(xiàn)了SomeDelegate。
但在Swift里面,就顯得不那么友好了,因為Swift是沒有辦法聲明一個變量同時繼承某個類和實現(xiàn)某個協(xié)議的。最接近的形式是組合協(xié)議,比如swift 3.0里面

var vc:UITableViewDelegate & UITableViewDataSource

聲明的vc同時實現(xiàn)UITableViewDelegate 和 UITableViewDataSource 兩個協(xié)議。

let vc:UIViewController & UITableViewDataSource

顯然,這是編譯不過的。

在網(wǎng)上找了很久,發(fā)現(xiàn)這個問題的答案貌似暫時還是無解。

stackoverflow上也有相關(guān)的討論:
https://stackoverflow.com/questions/35452785/swift-protocol-of-a-particular-class

里面給出的答案是聲明兩個變量,一個作為子類聲明,一個作為協(xié)議聲明,然后在賦值函數(shù)里面用泛型做好限制。作為一個不對外暴露的屬性,這樣做勉強還可以,就是太復(fù)雜了。

不過細(xì)想一下,也許是因為Swift本身的設(shè)計思想是鼓勵面向協(xié)議編程,所以不希望出現(xiàn)這種同時聲明繼承和協(xié)議的情況出現(xiàn)。所以最終的思路還是建議在程序?qū)崿F(xiàn)上使用純粹的面向協(xié)議的方式,放棄這個ObjC的壞習(xí)慣(也許是)吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容