在一个数组中的不同结构Swift

标签: Xcode struct ios Swift
发布时间: 2017/3/6 23:37:10
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我拥有了一个 struct 称为 trip

struct trip {
    var name: String
    var description: String
    var elements: [Any] = []

    mutating func addItemToElements(newValue: Any) {
       elements.append(newValue)
    }
}

正如你所看到的有是一个数组里面。我加上了一些其他结构喜欢 element_flight 到此数组的函数 addItemtoElements

struct element_flight {
    var origin: String
    var destination: String
    var flightno: String
    var departure: NSDate
    var arrival: NSDate
    var seat: String
}

然后我试图使用表格视图创建列表︰

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "elementTrip", for: indexPath) as! CellInElementsOfTripsTableViewCell
    let elem = trips[0].elements[indexPath.row]
    cell.mainTextLabel.text = elem.origin //it doesn't work

    return cell
}

我不能得到任何部分的结构 (如 origin 在代码中)。我到底做错了?

我创建了类似结构的 element_flight ,它可能是最好的方法,把它放在一个数组中,然后在表视图中显示。

解决方法 1:

一种简单、 幼稚解决方案会将其转换 elem 为正确的类型︰

cell.mainTextLabel.text = (elem as! element_flight).origin

但是,由于 elements 数组可以存储 Any ,如果 elem 是一些其他类型吗?很明显,它会崩溃 !

我不明白为什么你想要存储大量的 Anyelements 。这是一个标志或糟糕的代码。Any在很少采用 Swift

如果你只要存储某些类型,但不是 Any 类型,在 elements 、 创建Protocol和使所有您想要存储的类型符合它。至少你得到一点点的类型安全。

假设您的阵列将只包含两个结构︰ element_flightSomeOtherStruct 。你应该这样做︰

protocol SomeProtocol { // please give this a proper name yourself
    // properties/methods that are common among element_flight and SomOtherStruct
}

struct element_flight: SomeProtocol {
    // ...
}

struct SomeOtherStruct: SomeProtocol {
    // ...
}

并更改数组的类型是 [SomeProtocol]

现在在 cellForRowAtIndexPath 方法,您需要测试是否 elemelement_flightSomeOtherStruct :

if let flight = elem as? element_flight {
    cell.mainTextLabel.text = flight.origin
} else if let someOtherStuff = elem as? SomeOtherStruct {
    // do some other stuff
} else {
    // something's wrong if this is executed, maybe call fatalError
}
赞助商