1. 程式人生 > >Swift — 資料來源中的同構和異構

Swift — 資料來源中的同構和異構

對於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協議的型別例項。