在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]
我在问这最后一行。
答案 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
的替代方案更漂亮。)