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

kka*_*rol 0 arrays xcode struct ios swift

我有一个名为trip.

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

    mutating func addItemToElements(newValue: Any) {
       elements.append(newValue)
    }
}
Run Code Online (Sandbox Code Playgroud)

可以看到,里面有一个数组。我正在element_flight通过 function添加一些其他结构到这个数组中addItemtoElements

struct element_flight {
    var origin: String
    var destination: String
    var flightno: String
    var departure: NSDate
    var arrival: NSDate
    var seat: String
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用表视图创建一个列表:

    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
}
Run Code Online (Sandbox Code Playgroud)

我无法获得 struct 的任何部分(如origin代码)。我究竟做错了什么?

我正在创建类似的结构element_flight,这可能是将它放在一个数组中然后在表视图中显示的最佳方式。

Swe*_*per 5

一个简单、幼稚的解决方案是强制elem转换为正确的类型:

cell.mainTextLabel.text = (elem as! element_flight).origin
Run Code Online (Sandbox Code Playgroud)

但是,既然elements数组可以存储Any,那么如果elem是其他类型呢?显然,它会崩溃!

我不明白你为什么要存储一堆Anyin elements。这是一个标志或错误的代码。Any在 Swift 中很少使用。

如果您只是要存储某些类型,而不是Any类型,请elements创建一个协议并使您要存储的所有类型都符合它。至少你会得到一点类型安全。

假设您的数组将只包含两个结构: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 {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

并将数组更改为类型[SomeProtocol]

现在在cellForRowAtIndexPath方法中,您需要测试elemiselement_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
}
Run Code Online (Sandbox Code Playgroud)