gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:47:37 29 4
gpt4 key购买 nike

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 是有意义的到这个协议(protocol)。但是,我不能提供一个空的初始化程序,因为至少有一个 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

关于swift - 为什么 RangeReplaceableCollection 需要一个空的初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38231182/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com