以前寫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í)慣(也許是)吧。