2016-11-02 2 views
2

Ich konvertiere meinen Code in Swift 3 und habe nur noch 3 Buildtime-Fehler, von denen 2 mit meinem Unverständnis zu tun haben, wie Bereiche jetzt funktionieren. Zum Beispiel habe ich:ClosedRange und Array-Subskribierung in Swift 3

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

    var indices = [ Int ]() 
    for tense in tenseArray { 
     if let aRange = tenseRange[ tense ] { 
      indices.append(aRange) 
     } 
    } 

Wo Tense eine Enumeration ist, dass so etwas aussieht:

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

Und tenseRange ist definiert als:

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

und ist bevölkert wie folgt aus:

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

Für die Linie in func shuffle

indices.append(aRange) 

Ich erhalte den Fehler keinen Wert vom Typ '[Int]' mit einem Index vom Typ 'CountableRange' SUBSCRIPT kann. Ich würde diese Bereiche gerne in Ints umwandeln, um sie in Indizes eines Arrays zu verwenden, wie ich es früher in Swift konnte, aber ich kann nicht herausfinden, wie. Irgendwelche Ideen?

Vielen Dank im Voraus!

Antwort

2

Sie deklarieren indices als Array von Int, so dass Sie nicht append(_:) für ClosedRange<Int> verwenden können.

Also nehme ich an, dass Sie alle Werte in der ClosedRange an indices anhängen möchten. In diesem Fall müssen Sie möglicherweise append(contentsOf:), nicht append(_:) verwenden.

Array

...

func append(Element)

Fügt ein neues Element am Ende des Arrays.

...

func append(contentsOf: C)

Fügt das Element einer Sammlung an das Ende des Arrays.

func append(contentsOf: S)

Fügt die Elemente einer Sequenz an das Ende des Arrays.

Leider in Swift 3, CountableRange<T> ist keine Sammlung noch eine Sequenz.

Aber Swift 3 führte eine neue Bereich Familientypen, CountableClosedRange<T> und CountableRange<T>, die beide Sammlung sind. Und der Ergebnistyp des geschlossenen Bereichsoperators ... kann ein CountableClosedRange<T> sein, wenn er in einen bestimmten Kontext gestellt wird.

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

Oder können Sie Ihre tenseRange ‚s-Wert als CountableClosedRange<Int> erklären.

var tenseRange: [ Tense : CountableClosedRange<Int> ] = [:]