Swift — 資料來源中的同構和異構
阿新 • • 發佈:2019-01-08
對於Swift的集合資料來說,有同構和異構之分。如果你需要討論一群鳥類或者一批飛機,那麼這樣的資料是同構的,比如包含鳥類的陣列[Bird]和包含飛機的陣列[Airplane]。有時你想要探討的是這些空中傢伙們的共性:飛翔,因此你的資料來源可能同時包含Bird和Airplane,這樣的是劇院叫做異構資料。
Swift協議的一個重要作用就是構建異構資料,陣列的定義是泛型的,當你把協議作為型別去初始化一個數組的時候,實際是為陣列中成員的泛型定義了一層協議的約束。比如建立一個CanFly協議,協議宣告一個fly方法:
protocol CanFly{ func fly() } struct Bird:CanFly { var name = "" func fly() { print("鳥類在飛翔") } } struct Airplane:CanFly { var company = "" func fly(){ print("飛機在飛翔") } }
現在建立一個異構的陣列:
var flyArray:[CanFly] = [Bird(name:"麻雀"),Airplane(company:"南方航空")]
需要注意的是由於異構陣列可能存在多層共性,所以此時使用型別推斷時編譯器是無法確定flyArray的型別的,你需要明確指定異構陣列的上下文,這裡指定資料來源為[CanFly]型別的陣列,此時向陣列中傳入的所有成員都必須是遵守CanFly協議的型別例項。