我试图找到合并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?
}
所以我创建了一个类A
和B
对象的数组:
var array = [ A(), B(), A(), B() ]
此数组现在应为[A]
类型,因为这是A
和B
类的推断类型。
现在我想将对象附加到此数组,类型为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() ]
谢谢!
答案 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]