添加不同类型的数组
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
的替代方法更漂亮。)
在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
的替代方法更漂亮。)