Arrays [SuperClass]类型的Swift数组和[Subclass]类型的元素

Arrays [SuperClass]类型的Swift数组和[Subclass]类型的元素,arrays,swift,Arrays,Swift,有人能解释为什么这个代码会抛出错误吗 class Base {} class SubclassOfBase: Base {} let baseItems = [Base](count: 1, repeatedValue: Base()) let subclassItems = [SubclassOfBase](count: 3, repeatedValue: SubclassOfBase()) var items = [Base]() items.append(SubclassOfBase(

有人能解释为什么这个代码会抛出错误吗

class Base {}
class SubclassOfBase: Base {}

let baseItems = [Base](count: 1, repeatedValue: Base())
let subclassItems = [SubclassOfBase](count: 3, repeatedValue: SubclassOfBase())

var items = [Base]()
items.append(SubclassOfBase()) //OK
items.appendContentsOf(baseItems) //OK
items.appendContentsOf(subclassItems) //cannot invoke with argument of type [SubclassOfBase]
items.append(subclassItems.first!) //OK

下一个问题:添加子类元素的唯一方法是在for循环中逐个添加它们吗?

如果检查标题:

public mutating func append(newElement: Element)

public mutating func appendContentsOf<C : CollectionType where C.Generator.Element == Element>(newElements: C)

我认为这是一个bug,因为通过改进函数头可以很容易地修复这个错误(这也需要扩展到<代码> 子句,因为现在检测泛型子类型是不可能的)。 一些可能的解决办法:

  • 直接为每个项目追加

    subclassItems.forEach {items.append($0)}
  • 为数组声明帮助器方法(将适用于
    数组
    ,而不适用于泛型
    集合类型

  • 直投

    items.appendContentsOf(subclassItems as [Base])

  • 你能详细说明一下你将如何修复函数头吗?@CouchDeveloper好吧,我们不能修复它,但苹果可以。将其报告为错误。类型约束中的
    where
    子句要么要求类型相等,要么符合特定协议。在给定的问题中,我们需要一些新的谓词,比如is_a type,例如:
    @CouchDeveloper是的,这就是问题所在。where子句目前仅限于处理子类型。或“extension CollectionType where Generator.Element:Base{``可能的解决方法:
    items.appendContentsOf(子类项为[Base])
    extension Array {
        public mutating func appendContentsOf(newElements: [Element]) {
            newElements.forEach {
                self.append($0)
            }
        }
    }
    items.appendContentsOf(subclassItems as [Base])