26

我正在尝试检查特定字符串是否包含字母。

到目前为止,我遇到了NSCharacterSet.letterCharacterSet()一组字母,但我无法检查该集中的字符是否在给定的字符串中。当我使用此代码时,我收到一条错误消息:

'Character' 不能转换为 'unichar'

对于以下代码:

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

3 回答 3

55

您可以通过NSCharacterSet以下方式使用:

let letters = NSCharacterSet.letters

let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: characterSet)

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

在斯威夫特 2 中:

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

这取决于你,选择一种方式。我希望这对你有帮助。

于 2015-04-08T16:53:41.953 回答
8

您应该使用Strings 内置范围函数,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"用您要查找的任何字母替换。

一个不太灵活但有趣的快速注意事项是,您可以使用任何可用于Sequences 的功能。所以你可以这样做:

contains("abc", "c")

这当然只适用于个别角色,不灵活也不推荐。

于 2015-04-08T17:53:54.303 回答
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")
}
于 2015-04-08T16:52:41.320 回答