2016-07-03 10 views
-1

Ich möchte nur ein für allemal aussortieren:Swift - Strings: Sequenzen oder nicht?

In Swift. Kann der String-Datentyp wie eine Sequenz behandelt werden, z. B. Arrays und Tupel?

func printAnySequence<T: SequenceType>(anything: T) { 
    for element in anything { 
     print("\(element),") 
    } 
} 

printAnySequence("A random string") 

Der obige Code erzeugt einen Compiler-Fehler mit der Meldung: „Kann printAnySequence nicht aufrufen“ mit einer Argumentliste vom Typ String.

let randomString: String = "A random string" 

for char in randomString { 
    print(char) 
} 

Während der Code erzeugt über einen Compiler-Fehler mit der Meldung: „Typ‚String‘entspricht nicht das Protokoll‚SequenceType‘“

jedoch die Dokumentation für Swift ausdrücklich sagt, dass Strings Sequenzen festgelegt ist von Charakteren.

enter image description here

Wo ist mein Fehler?

Dank Max Xie

+0

Die Antwort ist "Nein". Wenn Sie eine Folge von Zeichen wünschen, verwenden Sie 'string.characters'. Die Wortfolge in der Dokumentation beschreibt die Art von Strings, sie sagt nichts über den Typ 'SequenceType' aus. Ein String-Literal ist auch etwas völlig anderes. – Sulthan

Antwort

1

Nein, StringSequenceType nicht implementieren. Die Dokumentation ruft ein Zeichenfolgenliteral eine "feste Abfolge von Textzeichen" auf, aber das hat nichts mit dem Protokoll SequenceType zu tun. String.characters hat jedoch den Typ String.CharacterView, der tut implementieren SequenceType (es implementiert sogar BidirectionalCollectionType).

Wenn Sie wirklich wollte, könnte man sehr leicht String entsprechen BidirectionalCollectionType (und RangeReplaceableCollectionType) lassen:

extension String: BidirectionalCollectionType, RangeReplaceableCollectionType { 
    // String already implements the necessary methods 
    // and properties, so we can leave this empty 
} 

Dies ist jedoch nicht zu empfehlen. Das Swift-Kernteam hat diese Konformität aus einem bestimmten Grund ausgelassen: Methoden in den Protokollerweiterungen SequenceType, CollectionType und andere Protokolle könnten aufgrund der Natur der Swift-Strings Annahmen über die Sequenz/Sammlung machen, die für String nicht gelten könnten.