添加不同类型的数组

时间:2017-09-06 20:21:36

标签: arrays swift casting downcast

在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]

我在问这最后一行。

1 个答案:

答案 0 :(得分:3)

以这种方式创建[Any]是Swift的一个错误。有些地方因为与Cocoa的桥接而弹出[Any],但你永远不应该独立创建它们。很难说你的意思是“一系列绝对的东西”。如果你的意思并非“绝对没有任何问题”,那么你的意思并不是Any。 (举一个含义的例子,考虑print,它正确接受“绝对任何东西”。)

如果你想要“一个字符串数组或BasicClasses”,那么就有一种类型。这是一个枚举:

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

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

这会将您的字符串和BasicClasses包装在Element类型中,然后创建[Element]

(注意我在这里使用+来组合数组,因为它在这种情况下非常方便,但是它可能会在编译时产生很大的问题,并且效率很低,因为它经常会强制执行太多的副本。除了数字之外,你通常应该避免使用+。但是在这个例子中它比使用.extend的替代方案更漂亮。)