2017-09-06 39 views
0

是否有更优雅的方式在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

你将如何使用数组中的数据?两个阵列会相互关联吗?或者你只是想将它们组合成一个数组? – OverD

+0

我只是想结合他们。例如,我可以通过“if let”访问字符串和类 – codddeer123

回答

3

以这种方式创建[Any]是Swift中的一个错误。 由于桥接到Cocoa而弹出,但你不应该独立创建它们。你的意思是“一系列绝对的东西”是非常罕见的。如果你的意思不是“绝对没有问题”,那你的意思不是Any。 (对于一个例子,这意味着,考虑print,它正确接受“绝对任何东西”。)

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

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

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

这种包装你的字符串,你BasicClasses的元素类型,然后创建一个[Element]。 (请注意,我在这里使用了+来组合数组,因为在这种情况下它非常方便,但是它可能会在编译时造成重大问题,而且效率低下,因为它经常需要太多副本。避免使用+来代替数字,但在这个例子中,它比使用.extend的替代品更漂亮。)