为什么RangeReplaceableCollection需要一个空的初始化器?

时间:2016-07-06 18:26:54

标签: swift swift3

RangeReplaceableCollection需要init()的实施。这个空的初始化程序似乎在init(_:)init(repeating:count:)removeAll(keepingCapacity:)的默认实现中使用,后者也应该可以使用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不需要它是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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

<强>增加:

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