2016-11-10 7 views
0

Ich habe Probleme mit einem der Swift3-Änderungen. Früher haben sie ... und ..< als Range behandelt, aber jetzt haben sie eine Tonne neuer "Unterbereiche". Ich möchte eine Funktion haben, die beide Bereichsvarianten nimmt.Range in Swift3

struct Test { 
    var data = [1,2,3,4,5] 
    subscript(r:Range<Int>) -> [Int] { 
    return Array(data[r]) 
    } 
} 
let t = Test() 
print(t[0...1]) // fails because now this is a ClosedRange 
print(t[0..<2]) 

Ich möchte ein Baby haben

subscript(r:TakesAnyRange<Int>) -> [Int] { 
+0

Dies könnte das sein, wonach Sie suchen: http://stackoverflow.com/a/40377303/1187415. –

+0

@MartinR Genau :-) Ich mag es, wenn Compiler-Designer ein einfaches Konstrukt durch eines ersetzen, das mindestens einen Doktortitel braucht>: - | –

+0

@MartinR Nun, da dies eine vereinfachte Frage ist, habe ich festgestellt, dass Ihre Lösung für einen "tiefgestellten" Text nicht funktioniert. Hast du einen anderen Zeiger? –

Antwort

0

Sie die Vervielfältigung durch statt mit CountableRange und CountableClosedRange vermeiden kann, da man auf die andere umwandelbar ist:

struct Test { 
    var data = [1,2,3,4,5] 

    subscript(r: CountableRange<Int>) -> [Int] { 
    return Array(data[r]) 
    } 

    subscript(r: CountableClosedRange<Int>) -> [Int] { 
    return self[CountableRange(r)] 
    } 
} 

Dies funktioniert gut für einen Int Bereich, was Sie in Ihrer Frage angegeben haben. Von der Apple-Dokumentation:

Sie können einen zählbaren Bereich über jede Art erstellen, die auf das Strideable Protokoll entspricht und verwenden eine ganze Zahl als seinen zugehörigen Stride-Typ. Standardmäßig sind Swifts Integer- und Zeigertypen als Grenzen eines zählbaren Bereichs verwendbar.

+0

Darauf hat Martin in der verknüpften Antwort hingewiesen. Ich wollte Doppelungen des "tiefgestellten" Textes vermeiden. –

+0

Eigentlich wies Martin darauf hin, dass Sie separate Methoden für 'Range' und' ClosedRange' definieren könnten. Das Problem dabei ist, dass Sie den gesamten Code in diesen Methoden kopieren müssten. Der Vorteil der Verwendung der Countable-Versionen besteht darin, dass Sie die eine in die andere konvertieren können, wodurch die Duplizierung vermieden wird. Beachten Sie, dass ich nur die Logik innerhalb einer der 'tiefgestellten' Methoden habe. – ganzogo

+0

Aber tatsächlich verwenden Sie die Vervielfältigung von 'tiefgestelltem 'mit' Zählbarem [geschlossenem] Bereich'' und das ist was ich vermeiden möchte: -/Ich möchte diesen 'tiefgestellten Index' nur einmal für beide Bereichsarten. Dieser Swift ist ein Gehirnwrack. –