2016-07-12 8 views
2

Warum ist es, dass:ClosedInterval <String> auf [String] in Swift

let i = 1...100 
let s = [Int](i) 

ergibt

[1, 2, 3, ..., 100] 

aber

let i = "a"..."z" 
let s = [String](i) 

Ausbeuten

Cannot invoke initializer for type '[String]' with an argument list of type '(ClosedInterval<String>)' 

noch

i.contains("b") 

ergibt

true 

Antwort

2

Int zu ForwardIndexType entspricht daher in

let i = 1...100 

... soll der Betreiber

public func ...<Pos : ForwardIndexType where Pos : Comparable>(start: Pos, end: Pos) -> Range<Pos> 

und das Ergebnis ist ein Range<Int>. Bereiche sind Sammlungen und Sequenzen: Man kann die Elemente des Bereichs aufzählen und daraus ein Array erstellen.

Aber String und Character entsprechen nicht ForwardIndexType: Es gibt keine Methode aus einer Zeichenfolge oder ein Zeichen, um zum nächsten zu gelangen. Daher in

let i = "a"..."z" 

... ist Betreiber

public func ...<Bound : Comparable>(start: Bound, end: Bound) -> ClosedInterval<Bound> 

und das Ergebnis ist ein ClosedInterval<String>. Sie können überprüfen, ob eine bestimmte Zeichenfolge in diesem Intervall enthalten ist, aber Sie können ihre Elemente nicht aufzählen.

"a"..."z" repräsentiert alle Saiten s für die "a" <= s <= "z" nach dem Unicode-Standard, und nicht nur den 26 Kleinbuchstaben aus dem Alphabet Englisch, zu vergleichen, z.B. What does it mean that string and character comparisons in Swift are not locale-sensitive?. Zum Beispiel

let c = i.contains("ä") 

ergibt true.

In Swift 3 haben die Reichweite und Intervalltypen wurden umbenannt und reorganisiert:

"1" ... "100" // CountableClosedRange<Int> 
"a" ... "z" // ClosedRange<String> 

Wenn Ihre Absicht ist es, ein Array mit allen Charakteren aus „a“ bis „z“ nach ihrer erstellen Bestellung in den Unicode-Tabellen dann Sie können die UTF-32 Codeeinheiten aufzählen:

let i = UnicodeScalar("a").value ... UnicodeScalar("z").value 
let charArray = (i.map { Character(UnicodeScalar($0)) }) 
// or 
let stringArray = (i.map { String(UnicodeScalar($0)) }) 

Das Ergebnis ist

["a", "b", "c", ... , "z"] 

als ein Array von Character oder ein Array von String.

Verwandte Themen