合并与相同的超类Swift数组
我试图find合并Swift数组的不同types的最佳方法,但它们具有相同的超类。 我已经阅读了所有的教程,所以我知道我可以使用:
var array = ["Some", "Array", "of", "Strings"] array += ["Another string", "and one more"] array.append(["Or", "This"])
在这种情况下, array
variables推断types[String]
。 我遇到的问题涉及到下一个类的假设情况( 属性在这种情况下无关紧要,只是在类之间做出区别 ):
class A { var property1 : String? } class B : A { var property2: String? } class C : A { var property3: String? }
所以我创build了一个类A
和B
对象的数组:
var array = [ A(), B(), A(), B() ]
这个数组现在应该是[A]
types的,因为这是A
和B
类的推断types。
现在我想将对象附加到这个数组,types为C
var anotherArray = [ C(), C(), C() ]
由于anotherArray
现在是types[C]
,所以我们仍然可以追加它,因为所有C
实例都对A
方法做出响应。 所以我们尝试:
array += anotherArray
由于:
Binary operator '+=' cannot be applied to operands of type '[A]' and '[C]'.
与使用append
方法类似的故事。 虽然这是有道理的,但我不明白为什么这不起作用。
有人可以解释为什么这是行不通的? 这个问题最好的解决办法是什么?
我发现唯一合理的解决scheme是将anotherArray
的types定义为[A]
,但是有没有更好的或者这是正确的?
var anotherArray : [A] = [ C(), C(), C() ]
谢谢!
如果C
从A
inheritance,那么可以将types为[C]
的数组“上传”为types为[A]
的数组,
array += anotherArray as [A]
除了Martin的回答,你可以创build一个协议,所有的类都符合,然后当创build你的数组时,使其input该协议。
然后你可以添加任何类到它而不铸造。
你几乎可以合并一切。 唯一的要求是结果数组的所有元素必须符合相同的协议。
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]