2015-10-06 90 views
1

我有異類這樣夫特:協議擴展和數組

struct Cat: Hashable { 
    let name: String 
    let catId: Int 
} 
struct SubCat: Hashable { 
    let name: String 
    let catId: Int 
    let parentCatId: Int 
} 

現在我有一個的tableView需要或者顯示貓或SUBCAT一些結構對象。我的第一個選擇是兩班,協議擴展:

protocol Selectable { 
    func asString() -> String 
} 

和我的結構變成了:

struct Cat: Hashable, Selectable { 
    let name: String 
    let catId: Int 
    func asString() -> { 
     return self.name 
    } 
} 
struct SubCat: Hashable, Selectable { 
    let name: String 
    let catId: Int 
    let parentCatId: Int 
    func asString() -> { 
     return self.name 
    } 
} 

它的工作至今。 我在TableViewController中聲明瞭一個[Selectable]對象,使用asString()來填充我的單元格。編譯就像一個魅力。

但這是事情。我有一個CatModel類和一個SubCatModel類,每個類都返回一個數組,每個結構體[Cats]和[SubCats] 當我嘗試將[Cat]數組分配給[Selectable]數組時,它不會編譯。如果我將[Cat]數組的返回類型更改爲[可選],則不會編譯。

任何人都可以幫助我嗎?我想我在這裏錯過了一些東西。 謝謝。

+0

我看你投它,當你設置你的陣列,通過測試協議。像這樣: 'if let selectableArray = catArray as?可選{} 讓我知道它是否可以幫助您 – jlngdt

+0

我已經嘗試過。編譯器說Selectable不是Cat的子類型: -/ – Khal

+0

哦,是的,cat是一個結構體,也許通過創建它而不是類? – jlngdt

回答

2

地圖Cat陣列到陣列Selectable

let selectableArray = catArray.map { $0 as Selectable } 
+0

謝謝:)正如Martin R.所說,它像一個魅力一樣工作! – Khal