arrays - 添加不同类型的数组

标签 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]

我问的是最后一行。

最佳答案

以这种方式创建 [Any] 在 Swift 中是一个错误。有一些地方 [Any] 会因为桥接到 Cocoa 而弹出,但你永远不应该单独创建它们。你的意思是“绝对是任何东西的数组”是非常罕见的。如果您的意思不是“绝对任何东西都可以”,那么您并不是指 Any。 (举个例子,考虑一下 print,它正确地接受“absolutely anything at all”。)

如果您想要“字符串数组或 BasicClasses”,那么有一个类型可以满足。这是一个枚举:

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

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

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

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

关于arrays - 添加不同类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46083738/

相关文章:

javascript - 如何从数组中的数组中绘制 AngularJs 表?

c - 使用 void* 指针将未知/混合类型传递给 printf() (一种在运行时推断类型)

java - 将 Collection<SomeClass> 转换为 Collection<SomeSuperClass>

java - 如何使用for循环循环二维数组?

javascript在平均计算中排除一些值

python - 将两个 2D numpy 数组乘以一个 3D 数组

swift - 如何在 Swift 中生成一个范围内的不同随机数?

ios - 调用方法时无法推断通用参数 'T'

swift - 如何向 ScrollView 添加背景并让它重复到最后?

c - 为什么在指针算术之前要强制转换为 (char *)? (container_of() 内部结构)