添加不同类型的数组

Adding arrays of different types

在Swift中添加两个不同类型的数组有更优雅的方法吗?

我的第一个尝试是将数组向下转换为 Any 并添加它。

class BasicClass {
    var name : String = ""
    var number : Int = -1

    init(name : String, number : Int){
        self.name = name
        self.number = number
    }
}

let basicClass1 = BasicClass(name: "bc1", number: 1)
let basicClass2 = BasicClass(name: "bc2", number: 2)
let basicClass3 = BasicClass(name: "bc3", number: 3)

let basicClasses : [BasicClass] = [basicClass1, basicClass2, basicClass3]

for bc in basicClasses{
    print(bc.name)
}

let strings : [String] = ["one", "two", "three"]

var anyArray : [Any] = strings as [Any] + basicClasses as [Any]

我问的是最后一行。

以这种方式创建 [Any] 是 Swift 中的一个错误。由于桥接到 Cocoa,有些地方 [Any] 会弹出,但您永远不应该单独创建它们。你的意思是 "an array of absolutely anything at all." 是非常罕见的,如果你不是 "absolutely anything at all is fine,",你就不是 Any。 (例如,考虑 print,它正确地接受 "absolutely anything at all.")

如果您想要 "an array of strings or BasicClasses",那么这里有一个类型。这是一个枚举:

enum Element {
    case basicClass(BasicClass)
    case string(String)
}

let combined = strings.map(Element.string) + basicClasses.map(Element.basicClass)

这将你的字符串和你的 BasicClasses 包装在 Element 类型中,然后创建一个 [Element].

(请注意,我在这里使用 + 来组合数组,因为在这种情况下它非常方便,但它会在编译时间上产生重大问题,而且效率低下,因为它经常强制太多副本。通常应避免将 + 用于除数字以外的任何内容。但在本例中,它比使用 .extend 的替代方法更漂亮。)