2015-04-08 51 views
16

Tôi đang cố kiểm tra xem một chuỗi cụ thể có chứa chữ cái hay không.Làm cách nào để kiểm tra xem chuỗi có chứa chữ cái trong Swift không?

Cho đến nay tôi đã xem qua NSCharacterSet.letterCharacterSet() dưới dạng tập hợp các chữ cái, nhưng tôi đang gặp sự cố khi kiểm tra xem ký tự trong tập hợp đó có nằm trong chuỗi đã cho hay không. Khi tôi sử dụng mã này, tôi nhận được một lỗi nêu:

'nhân vật' không phải là chuyển đổi thành 'unichar'

Đối với đoạn mã sau:

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

So sánh [Cách tốt nhất để xác định xem chuỗi có chứa ký tự từ tập hợp trong Swift] hay không (http://stackoverflow.com/questions/28486138/what-is-the-best-way-to-determine -if-a-string-contains-a-ký tự-từ-a-set-in)? –

+0

@MartinR Tại sao "so sánh"? Nó trông giống như một bản sao khá vững chắc với tôi. – dasblinkenlight

Trả lời

32

Bạn có thể sử dụng NSCharacterSet theo cách sau:

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

Hoặc bạn có thể làm điều này quá:

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

Trong 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 
} 

Đó là tùy thuộc vào bạn, chọn một cách. Tôi hy vọng điều này sẽ giúp bạn.

+0

Khối mã thứ hai của bạn không biên dịch trong Swift, bạn phải sử dụng dấu ngoặc kép. –

+0

@MartinR Vâng, bạn cảm ơn. –

+0

Tôi đã thử giải pháp đầu tiên, và nó hoạt động, mặc dù tôi không chắc rằng tôi hiểu dòng 'if let test = range'. – qmlowery

4

Vấn đề với .characterIsMember là phải mất một unichar (một typealias cho UInt16).

Nếu bạn lặp đầu vào của bạn sử dụng giao diện utf16 của chuỗi, nó sẽ làm việc:

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

Bạn cũng có thể bỏ qua các vòng lặp và sử dụng các thuật toán contains nếu bạn chỉ muốn kiểm tra sự hiện diện/không hiện diện:

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

NSCharacterSet cũng có một phương thức longCharacterIsMember, có thể được sử dụng với các giá trị Unicode "đầy đủ", xem http://stackoverflow.com/a/24502779/1187415 cho một ví dụ. –

+0

Xin cảm ơn, điều đó tốt hơn nhưng vẫn có trường hợp cạnh tranh (“!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞ ”sẽ được gắn cờ là các chữ cái) –

+0

Thật thú vị không phải bởi một regex với' [: alpha:] 'mặc dù –

6

Bạn nên sử dụng chức năng phạm vi tích hợp sẵn trong String s với NSCharacterSet thay vì cuộn giải pháp của riêng bạn. Điều này cũng sẽ giúp bạn linh hoạt hơn nhiều (ví dụ như tìm kiếm phân biệt chữ hoa chữ thường nếu bạn muốn).

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

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

Thay thế "aeiou" bằng bất kỳ chữ cái nào bạn đang tìm kiếm.

Một lưu ý nhanh hơn nhưng linh hoạt, nhanh chóng giống nhau, là bạn có thể sử dụng bất kỳ chức năng nào có sẵn cho Sequence s. Vì vậy, bạn có thể làm điều này:

contains("abc", "c") 

Điều này tất nhiên sẽ chỉ hoạt động cho các ký tự riêng lẻ, không linh hoạt và không được khuyến nghị.

Các vấn đề liên quan