有人能解释为什么这段代码会抛出错误吗?
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
解决方法
如果您检查标题:
public mutating func append(newElement: Element) public mutating func appendContentsOf<C : CollectionType where C.Generator.Element == Element>(newElements: C)
请注意类型说明符的不同之处.虽然append允许您添加任何元素,即包括子类,但appendContentsOf强制您使用具有完全相同元素类型的数组(不允许子类).
它适用于:
let subclassItems = [Base](count: 3,repeatedValue: SubclassOfBase())
我认为这是一个错误,因为这可以通过改进函数头很容易解决(好吧,这也需要扩展到where子句,因为现在检测通用子类型是不可能的).
一些可能的解决方法:
>直接附加每个项目
subclassItems.forEach {items.append($0)}
>为Arrays声明一个辅助方法(适用于Array,不适用于通用CollectionType)
extension Array { public mutating func appendContentsOf(newElements: [Element]) { newElements.forEach { self.append($0) } } }
>直接演员
items.appendContentsOf(subclassItems as [Base])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。