2016-07-06 27 views
2

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はありませんか?

答えて

0

"空のイニシャライザは、objc.io" Advanced Swift "という言及と同じ型の新しい空のコレクションを作成できるため、汎用関数で便利です。

私にとっては、実装はオプションである必要がありますが、それは迅速な進化のグループで議論する価値があると思います。

なぜ、startIndexにデフォルト値0を設定できないのですか?

追加:実はそれはすでにここで議論された

https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160704/002510.html

+0

私はまた、高度なスウィフトスニペットを読んで、私はそれが非常に不満足なものだと思いました。なぜなら、空の初期化子が別のものではなく、 'RangeReplaceableCollection'に適している理由を実際に説明するものではありません。それは有用かもしれないが、確かにその特定のプロトコルで意味をなさないはずである。 –

+0

'startIndex'は私の例ではデフォルト値0を持つことができません。整数だけでなく、' Strideable'インデックスを許可していたからです。 :) –

+1

私も進化のスレッドを読む(実際には、私はそれを開始した)。私は 'init()'を別のプロトコルに移すという提案をするつもりです。 –

関連する問題