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])