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

swift – 为什么RangeReplaceableCollection需要一个空的初始化

发布时间:2020-12-14 04:28:07 所属栏目:百科 来源:网络整理
导读:RangeReplaceableCollection需要init()的实现.这个空的初始化器似乎在init(_ :),init(重复:count :)和removeAll(keepsCapacity :)的默认实现中使用,后者也应该可以用removeSubrange(_ :)实现. 为什么这三个初始化器是RangeReplaceableCollection的一部分?
RangeReplaceableCollection需要init()的实现.这个空的初始化器似乎在init(_ :),init(重复:count :)和removeAll(keepsCapacity :)的默认实现中使用,后者也应该可以用removeSubrange(_ :)实现.

为什么这三个初始化器是RangeReplaceableCollection的一部分?

我是如何遇到的:我正在创建一个行为类似于数组的集合,但可以使用符合Strideable的任何通用索引进行下标.它的声明如下:

public struct AnyIndexArray
<Index: Strideable,Element where Index.Stride == Int> {

    private var elements: [Element]
    public var startIndex: Index

    public init<S: Sequence where S.Iterator.Element == Element>
        (elements: S,startIndex: Index) {
        self.elements = Array(elements)
        self.startIndex = startIndex
    }

}

由于底层数组符合RangeReplaceableCollection,因此将AnyIndexArray与此协议一致也是有意义的.但是,我无法提供空的初始化器,因为至少需要一个startIndex.如果我仍然实现空的初始化器并且只将fatalError()放入其体内,一切正常 – 除了三个初始化器和removeAll.

什么是RangeReplaceableCollection它需要一个空的初始化器,而Collection不需要?

解决方法

“一个空的初始化器 – 在泛型函数中很有用,因为它允许函数创建相同类型的新空集合”,如objc.io“Advanced Swift”一书所述.

对我来说,听起来实现应该是可选的,但值得在swift-evolution组中进行讨论.

在你的情况下为什么startIndex不能有默认值0?

加成:

实际上已经在这里讨论了https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160704/002510.html

(编辑:李大同)

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

    推荐文章
      热点阅读