2015-04-08 22 views
16

Belirli bir dizenin harf içerip içermediğini kontrol etmeye çalışıyorum.Bir dize Swift'de harfler içerip içermediğini nasıl kontrol edebilirim?

Şimdiye kadar NSCharacterSet.letterCharacterSet()'u bir dizi harfle karşılaştım ama bu dizideki bir karakterin verilen dizede olup olmadığını kontrol etmekte sorun yaşıyorum. Bu kodu kullandığınızda, ben belirten bir hata alıyorum:

'Karakter' 'unichar' Aşağıdaki kodu için

dönüştürülebilir değildir

: .characterIsMember ile

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

Karşılaştır [Bir dizginin Swift'de bir karakterden bir karakter içerip içermediğini belirlemenin en iyi yolu nedir] (http://stackoverflow.com/questions/28486138/what-is-the-best-way-to-determine -if-a-string-içerir-a-karakter-in-a-set-in)? –

+0

@MartinR Neden "karşılaştır"? Bana oldukça katı bir kopya gibi görünüyor. – dasblinkenlight

cevap

32

aşağıdaki şekilde NSCharacterSet kullanabilirsiniz:

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") 
} 

Yada sen de bunu yapabilirsiniz:

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

Swift 2'de:

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

O size kalmış, bir yol seçin. Umarım bu sana yardımcı olur.

+0

İkinci kod bloğunuz Swift'de derlenmiyor, çift tırnak kullanmanız gerekiyor. –

+0

@MartinR Evet, haklısınız teşekkürler. –

+0

İlk çözümü denedim ve işe yaradı, ancak 'test edelim' satır satırını 'anladığımdan emin değilim. – qmlowery

4

sorun unichar (UInt16 için bir typealias) alır. Eğer string utf16 görünümünü kullanarak girişinizi yineleme durumunda

, işe yarayacak:

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

Ayrıca döngü atlayabilirsiniz ve sadece varlığı/olmayan kontrol etmek istiyorsanız contains algoritma kullanıyoruz varlığı:

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

NSCharacterSet, "tam" Unicode değerleri ile kullanılabilen bir longCharacterIsMember yöntemine de sahiptir, bkz. Http://stackoverflow.com/a/24502779/1187415. –

+0

Ah teşekkürler, bu daha iyi ama hala kenar durumları var (“!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞ ”harf olarak işaretlenecektir. –

+0

İlginçtir: [: alpha:]' ile bir regex ile değil –

6

String s yerleşik menzil işlevlerini kendi çözümünüzü kullanmak yerine NSCharacterSet ile kullanmalısınız. Bu da size çok daha fazla esneklik kazandıracaktır (eğer arzu ederseniz büyük/küçük harf duyarsız arama gibi).

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

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

Yedek aradığınız ne olursa olsun harflerle "aeiou".

Daha az esnek, ancak eğlenceli bir hızlı not tümüyle aynı, Sequence s için kullanılabilir işlevlerden herhangi birini kullanabilirsiniz. Bunu yapabilirsiniz:

contains("abc", "c") 

Bu, elbette ki tek tek karakterler için çalışır ve esnek değildir ve önerilmez.

İlgili konular