使用相同的超类合并Swift数组

时间:2015-05-11 14:07:22

标签: ios macos swift

我试图找到合并Swift数组的最佳方法,它们的类型不同,但它们具有相同的超类。我已经阅读了所有教程,所以我知道我可以使用:

var array = ["Some", "Array", "of", "Strings"]
array += ["Another string", "and one more"]
array.append(["Or", "This"])

在这种情况下,array变量推断出类型[String]。我遇到的问题与类的下一个假设情况有关(属性在这种情况下无关紧要,只是为了区分类):

class A {
    var property1 : String?
}

class B : A {
    var property2: String?
}

class C : A {
    var property3: String?
}

所以我创建了一个类AB对象的数组:

var array = [ A(), B(), A(), B() ]

此数组现在应为[A]类型,因为这是AB类的推断类型。

现在我想将对象附加到此数组,类型为C

var anotherArray = [ C(), C(), C() ]

由于anotherArray现在属于[C]类型,我们仍然可以追加它,因为所有C个实例都会响应A方法。所以我们尝试:

array += anotherArray

由于以下原因导致失败:

Binary operator '+=' cannot be applied to operands of type '[A]' and '[C]'.

使用append方法的类似故事。虽然这确实有意义,但我无法理解为什么这不起作用。

有人可以解释为什么这不起作用吗?这个问题的最佳解决方案是什么?

我找到的唯一明智的解决方案是将anotherArray的类型定义为[A],但有没有更好的或这是正确的?

var anotherArray : [A] = [ C(), C(), C() ]

谢谢!

3 个答案:

答案 0 :(得分:10)

如果C继承自A,那么您可以" upcast"类型为[C]

的数组[A]的数组
array += anotherArray as [A]

或者,使用(使用Swift 4测试)

array.append(contentsOf: anotherArray)

答案 1 :(得分:2)

除了Martin的回答,您可以创建一个所有类符合的协议,然后在创建数组时,使其成为协议的类型。

然后你可以添加任何类而不进行强制转换。

答案 2 :(得分:0)

你可以合并几乎所有东西。唯一的要求是结果数组的所有元素必须符合相同的协议。

let arr1 = [1,2,3]          // [Int]
let arr2 = [4.0,5.0,6.0]    // [Double]
let arr3 = ["a","b"]        // [String]

import Foundation // NSDate
let arr4 = [NSDate()]       // [NSDate]

// the only common protocol in this case is Any
var arr:[Any] = []

arr1.forEach { arr.append($0) }
arr2.forEach { arr.append($0) }
arr3.forEach { arr.append($0) }
arr4.forEach { arr.append($0) }

print(arr) // [1, 2, 3, 4.0, 5.0, 6.0, "a", "b", 2016-02-15 08:25:03 +0000]