如何检查字符串是否包含Swift中的字母?

时间:2015-04-08 16:45:12

标签: swift nscharacterset

我试图检查特定字符串是否包含字母。

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

  

'字符'不能转换为' unichar'

以下代码:

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

3 个答案:

答案 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的问题在于它需要unicharUInt16的类型)。

如果使用字符串的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")
}