2016-10-04 8 views
2
var str = "Hello" 

print(str.characters) // CharacterView(_core: Swift._StringCore(_baseAddress: Optional(0x000000011c9a68a0), _countAndFlags: 5, _owner: nil)) 

print(str.characters.index(of: "o")!) // Index(_base: Swift.String.UnicodeScalarView.Index(_position: 4), _countUTF16: 1) 
print(Array(str.characters)) // ["H", "e", "l", "l", "o"] 
print(str.characters.map{String($0)}) //["H", "e", "l", "l", "o"] 

for character in str.characters{ 
    print(character) 
} 
// H 
// e 
// l 
// l 
// o 

las ich this Frage. Ich sah in String von Swift Referenz und gefunden: var characters: String.CharacterView.Was gibt String-Zeichen zurück?

Noch frage ich mich was genau ist str.characters zurück? Wie kommt es, dass ich in leicht so aufzählen kann, oder es zu einem Array oder Karte es konvertieren, aber es dann selbst drucken oder sogar indiziert, wenn in es so Kauderwelsch druckt

Ich bin ziemlich sicher, was ich nicht verstehe, ist, weil nicht characterView zu verstehen. Ich habe gehofft, dass jemand einen Laien-Überblick darüber geben kann, was es in dieser Frage macht und was es hier bedeutet.

+1

Sie sollten nicht nur in der 'CharacterView'-Dokumentation suchen, sondern auch in der Dokumentation der Protokolle, nach denen sie sich richten. Dies sind die Dinge, nach denen Sie suchen. Zum Beispiel können Sie "CharacterView" aufzählen, weil es dem 'Sequence'-Protokoll entspricht. – Fantattitude

+0

@Fantattitude Ich lese es gerade noch einmal, immer noch verloren – Honey

Antwort

2

str.characters gibt ein String.CharacterView - das stellt eine Ansicht auf die Zeichen der Zeichenfolge, so dass Sie auf sie zuzugreifen, ohne den Inhalt in einen neuen Puffer kopieren zu müssen (während Array(str.characters) oder str.characters.map{...} tun würde genau das tun).

String.CharacterView selbst ist ein Collection die durch eine String.CharacterView.Index (einem lichtundurchlässigen Indextyp) indiziert ist und Elemente (unsurprisingly) vom Typ Character (die einen erweiterten Graphem-Cluster repräsentiert - was im allgemeinen ein Leser würde eine ‚Einzelzeichen‘ betrachten zu Sein).

let str = "Hello" 

// indexed by a String.Index (aka String.CharacterView.Index) 
let indexOfO = str.characters.index(of: "o")! 

// element of type Character 
let o = str.characters[indexOfO] 

// String.CharacterView.IndexDistance (the type used to offset an index) is of type Int 
let thirdLetterIndex = str.characters.index(str.startIndex, offsetBy: 2) 

// Note that although String itself isn't a Collection, it implements some convenience 
// methods, such as index(after:) that simply forward to the CharacterView 
let secondLetter = str[str.index(after: str.startIndex)] 

Der Grund dafür, dass es durch eine spezielles String.CharacterView.Index indexiert wird, anstatt beispielsweise ein Int, besteht darin, dass Zeichen mit unterschiedlichen Bytelängen codiert werden können. Daher Indizierung potentiell wird (im Falle der Nicht-ASCII-Zeichenketten gespeichert sind), um eine O (n) Operation (erfordert durch die codierte Zeichenfolge Iterieren). Allerdings fühlt sich Indizierung mit einem Int natürlich wie es ein O sein soll (1) Betrieb (billig, nicht Iteration erforderlich).

str.characters[str.characters.index(str.characters.startIndex, offsetBy: n)] // feels O(n) 
str.characters[n] // illegal, feels O(1) 

Wie kommt es, dass ich so leicht in sie aufzählen kann, oder es in ein Array umwandeln oder wo es sich dann aber selbst drucken oder sogar indiziert, wenn in es so Kauderwelsch druckt

Sie sind in der Lage Array und map(_:) ein String.CharacterView einfach aufzuzählen, konvertieren, weil es ein Collection ist - und entspricht daher Sequence, die for ... in Looping sowie die Verwendung von map(_:) und dererlaubtKonstrukteur, unter anderem.

Was, warum Ausdrucken str.characters Ergebnisse in ‚Kauderwelsch‘ ist bis auf die Tatsache, dass es einfach nicht Darstellung eine eigene benutzerdefinierte Text über die Konformität mit entweder CustomStringConvertible oder CustomDebugStringConvertible bietet.

+0

Vielen Dank besonders für Ihren letzten Absatz. Obwohl einige Zeilen erfordern, dass ich hin und her komme. :) – Honey

+0

@Honey Glücklich zu helfen :) – Hamish

Verwandte Themen