【问题标题】:Merge Swift Array with same superclass将 Swift 数组与相同的超类合并
【发布时间】:2015-05-11 14:07:22
【问题描述】:

我正在尝试找到合并 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() ]

谢谢!

【问题讨论】:

    标签: ios macos swift


    【解决方案1】:

    如果C 继承自A,那么您可以将[C] 类型的数组“向上转换”为[A] 类型的数组

    array += anotherArray as [A]
    

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

    array.append(contentsOf: anotherArray)
    

    【讨论】:

      【解决方案2】:

      除了 Martin 的回答之外,您还可以创建一个所有类都符合的协议,然后在创建数组时,输入该协议。

      然后你可以在不强制转换的情况下添加任何类。

      【讨论】:

      • var anotherArray: [A] = [ C(), C(), C() ],所以它知道在数组中使用哪种类型。
      • 如果array 的类型为[P]anotherArray 类型为[B],其中B 符合P 协议,那么你也必须向上转型。 array += anotherArray 无法编译。
      【解决方案3】:

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

      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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多