RangeReplaceableCollection
は、init()
の実装が必要です。この空の初期化子は、init(_:)
,init(repeating:count:)
およびremoveAll(keepingCapacity:)
のデフォルトの実装で使用されているようですが、後者の実装もremoveSubrange(_:)
で実装する必要があります。RangeReplaceableCollectionに空のイニシャライザが必要なのはなぜですか?
なぜこれらの3つの初期化子が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()
を置くと、3つのイニシャライザとremoveAll
を除いてすべて正常に動作します。
RangeReplaceableCollection
とは何ですか、空のイニシャライザが必要ですが、Collection
はありませんか?
私はまた、高度なスウィフトスニペットを読んで、私はそれが非常に不満足なものだと思いました。なぜなら、空の初期化子が別のものではなく、 'RangeReplaceableCollection'に適している理由を実際に説明するものではありません。それは有用かもしれないが、確かにその特定のプロトコルで意味をなさないはずである。 –
'startIndex'は私の例ではデフォルト値0を持つことができません。整数だけでなく、' Strideable'インデックスを許可していたからです。 :) –
私も進化のスレッドを読む(実際には、私はそれを開始した)。私は 'init()'を別のプロトコルに移すという提案をするつもりです。 –