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
不需要它是什么?
答案 0 :(得分:0)
“一个空的初始化器 - 在泛型函数中很有用,因为它允许函数创建相同类型的新空集合”,如objc.io“Advanced Swift”一书所述。
对我而言,听起来实现应该是可选的,但值得在swift-evolution组中进行讨论。
在你的情况下为什么startIndex不能有默认值0?
<强>增加:强>
实际上这里已经讨论了https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160704/002510.html