我试图检查特定字符串是否包含字母。
到目前为止,我已经遇到NSCharacterSet.letterCharacterSet()
作为一组字母,但我无法检查该集合中的字符是否在给定字符串中。当我使用此代码时,我收到一条错误消息:
'字符'不能转换为' unichar'
以下代码:
for chr in input{
if letterSet.characterIsMember(chr){
return "Woah, chill out!"
}
}
答案 0 :(得分:42)
您可以通过以下方式使用NSCharacterSet
:
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")
}
或者你也可以这样做:
func containsOnlyLetters(input: String) -> Bool {
for chr in input {
if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
return false
}
}
return true
}
在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
}
由你决定,选择一种方式。我希望这能帮到你。
答案 1 :(得分:6)
您应该将String
内置范围函数与NSCharacterSet
一起使用,而不是使用自己的解决方案。这也将为您提供更多的灵活性(如果您愿意,可以使用不区分大小写的搜索)。
let str = "Hey this is a string"
let characterSet = NSCharacterSet(charactersInString: "aeiou")
if let _ = str.rangeOfCharacterFromSet(characterSet, options: .CaseInsensitiveSearch) {
println("true")
}
else {
println("false")
}
用您正在寻找的任何字母替换"aeiou"
。
一个不那么灵活,但有趣的快速笔记,就是你可以使用Sequence
的任何可用功能。所以你可以这样做:
contains("abc", "c")
这当然只适用于个别角色,并且不灵活,不推荐使用。
答案 2 :(得分:4)
.characterIsMember
的问题在于它需要unichar
(UInt16
的类型)。
如果使用字符串的utf16
视图迭代输入,它将起作用:
let set = NSCharacterSet.letterCharacterSet()
for chr in input.utf16 {
if set.characterIsMember(chr) {
println("\(chr) is a letter")
}
}
如果您只想检查是否存在,您也可以跳过循环并使用contains
算法:
if contains(input.utf16, { set.characterIsMember($0) }) {
println("contains letters")
}