2016-11-02 4 views
2

私のコードをSwift 3に変換していますが、3つのビルドタイムエラーが残っています。そのうちの2つはレンジの現在の仕組みを理解できていません。例えば、私が持っている:Swift 3のClosedRangeと配列の添え字

func shuffle(_ tenseArray: [ Tense ], ... 

    var indices = [ Int ]() 
    for tense in tenseArray { 
     if let aRange = tenseRange[ tense ] { 
      indices.append(aRange) 
     } 
    } 
Tenseのようなものに見える列挙です

enum Tense: String { 
    case IndicativePresent = "Indicative Present" 
    case IndicativePreterite = "Indicative Preterite" 
    case IndicativeImperfect = "Indicative Imperfect" 
    ... 

そしてtenseRangeは次のように定義されています

var tenseRange: [ Tense : ClosedRange<Int> ] = [:] // maps Tense enums to ranges of tense indices 

と、次のように読み込まれます。

tenseRange[ Tense.IndicativePresent ] = (11 ... 16) 
tenseRange[ Tense.IndicativePreterite ] = (17 ... 22) 
tenseRange[ Tense.IndicativeImperfect ] = (23 ... 28) 
... 

indices.append(aRange) 

の行のために210

は、私が「CountableRange」タイプのインデックスと「[INT]」タイプの値を添字できないエラーを取得しています。以前はSwiftでできるように、配列のインデックスに使用するために、これらの範囲をintに変換したいのですが、どのようにしてわかるかわかりません。何か案は?

ありがとうございます!

答えて

2

あなたはIntArrayとしてあなたindicesを宣言するので、あなたはClosedRange<Int>ためappend(_:)を使用することはできません。

したがって、ClosedRangeのすべての値をindicesに追加するとします。

ではなく、append(contentsOf:)を使用する必要があります。

Array

...

func append(Element)

配列の末尾に新しい要素を追加します。

...

func append(contentsOf: C)

配列の末尾にコレクションの要素を追加します。

func append(contentsOf: S)

アレイの端部に配列の要素を追加します。

残念ながら、Swift 3ではCountableRange<T>はコレクションでもシーケンスでもありません。

しかし、Swift 3では、新しいRangeファミリタイプ、CountableClosedRange<T>CountableRange<T>が導入されています。どちらもCollectionです。特定のコンテキストに配置された場合、結果のタイプの閉鎖範囲演算子...CountableClosedRange<T>になります。

 indices.append(contentsOf: aRange.lowerBound...aRange.upperBound) 

さもないと、あなたはCountableClosedRange<Int>としてあなたtenseRangeの値を宣言することができます。

var tenseRange: [ Tense : CountableClosedRange<Int> ] = [:] 
関連する問題