加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

数组 – [SuperClass]类型的Swift数组,其元素类型为[Subclass]

发布时间:2020-12-14 04:50:11 所属栏目:百科 来源:网络整理
导读:有人能解释为什么这段代码会抛出错误吗? class Base {}class SubclassOfBase: Base {}let baseItems = [Base](count: 1,repeatedValue: Base())let subclassItems = [SubclassOfBase](count: 3,repeatedValue: SubclassOfBase())var items = [Base]()items.
有人能解释为什么这段代码会抛出错误吗?

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)

请注意类型说明符的不同之处.虽然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])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读