2015-10-06 46 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