2015-04-08 15 views
16

Ich versuche zu überprüfen, ob eine bestimmte Zeichenfolge Buchstaben enthält oder nicht.Wie kann ich überprüfen, ob eine Zeichenfolge in Swift Buchstaben enthält?

Bisher bin ich auf NSCharacterSet.letterCharacterSet() als eine Reihe von Buchstaben gestoßen, aber ich habe Probleme zu überprüfen, ob ein Zeichen in diesem Satz in der angegebenen Zeichenfolge ist. Wenn ich diesen Code verwenden, erhalte ich eine Fehlermeldung,:

'Charakter' nicht konvertierbar 'unichar' ist

Für den folgenden Code:

for chr in input{ 
    if letterSet.characterIsMember(chr){ 
     return "Woah, chill out!" 
    } 
} 
+0

Vergleichen [Was ist der beste Weg zu bestimmen, ob eine Zeichenfolge ein Zeichen aus einem Satz in Swift enthält] (http://stackoverflow.com/questions/28486138/what-is-the-best-way-to-determinine -if-a-string-enthält-ein-Zeichen-from-a-set-in)? –

+0

@MartinR Warum "vergleichen"? Es sieht aus wie eine ziemlich solide Kopie für mich. – dasblinkenlight

Antwort

32

Sie NSCharacterSet auf folgende Weise verwenden:

let letters = NSCharacterSet.letterCharacterSet() 

let phrase = "Test case" 
let range = phrase.rangeOfCharacterFromSet(letters) 

// range will be nil if no letters is found 
if let test = range { 
    println("letters found") 
} 
else { 
    println("letters not found") 
} 

Oder Sie können dies auch tun:

func containsOnlyLetters(input: String) -> Bool { 
    for chr in input { 
     if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z")) { 
     return false 
     } 
    } 
    return true 
} 

In Swift 2:

func containsOnlyLetters(input: String) -> Bool { 
    for chr in input.characters { 
     if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z")) { 
     return false 
     } 
    } 
    return true 
} 

Es liegt an Ihnen, wählen Sie eine Art und Weise. Ich hoffe das hilft dir.

+0

Ihr zweiter Codeblock kompiliert nicht in Swift, Sie müssen doppelte Anführungszeichen verwenden. –

+0

@MartinR Ja, du hast recht, danke. –

+0

Ich habe die erste Lösung versucht, und es hat funktioniert, obwohl ich nicht sicher bin, ob ich die Zeile 'if let test = range' verstehe. – qmlowery

4

Das Problem mit .characterIsMember ist, dass es eine unichar (eine Typalias für UInt16) dauert.

Wenn Sie Ihre Eingabe mit der utf16 Ansicht des Strings iterieren, wird es funktionieren:

let set = NSCharacterSet.letterCharacterSet() 
for chr in input.utf16 { 
    if set.characterIsMember(chr) { 
     println("\(chr) is a letter") 
    } 
} 

Sie können auch die Schleife überspringen und verwenden Sie den contains Algorithmus, wenn Sie nur für das Vorhandensein/Nicht überprüfen möchten Präsenz:

if contains(input.utf16, { set.characterIsMember($0) }) { 
    println("contains letters") 
} 
+0

NSCharacterSet hat auch eine Methode longCharacterIsMember, die mit den "vollen" Unicode-Werten verwendet werden kann, siehe http://stackoverflow.com/a/24502779/1187415 für ein Beispiel. –

+0

Ah danke, das ist besser, aber es gibt immer noch Randfälle ("!12 "wird als Buchstaben markiert) –

+0

Interessanterweise nicht durch eine Regex mit' [: alpha:] 'obwohl –

6

Sie sollten die String s eingebauten Bereichsfunktionen mit NSCharacterSet statt rollen Sie Ihre eigene Lösung verwenden. Dies wird Ihnen viel mehr Flexibilität (wie Case-Sensitive Suche, wenn Sie es wünschen).

let str = "Hey this is a string" 
let characterSet = NSCharacterSet(charactersInString: "aeiou") 

if let _ = str.rangeOfCharacterFromSet(characterSet, options: .CaseInsensitiveSearch) { 
    println("true") 
} 
else { 
    println("false") 
} 

Ersatz "aeiou" mit dem, was Buchstaben Sie suchen.

Eine weniger flexible, aber lustige schnelle Anmerkung egal, ist, dass Sie eine der verfügbaren Funktionen für Sequence s verwenden können. So können Sie dies tun:

contains("abc", "c") 

Dies wird natürlich nur für einzelne Zeichen funktionieren, und ist nicht flexibel und nicht zu empfehlen.

Verwandte Themen