如何检查字符串是否包含 Swift 中的字母?
How can I check if a string contains letters in Swift?
我正在尝试检查特定字符串是否包含字母。
到目前为止,我遇到的 NSCharacterSet.letterCharacterSet()
是一组字母,但我无法检查该组中的字符是否在给定字符串中。当我使用此代码时,我收到一条错误消息:
'Character' is not convertible to 'unichar'
对于以下代码:
for chr in input{
if letterSet.characterIsMember(chr){
return "Woah, chill out!"
}
}
.characterIsMember
的问题在于它需要 unichar
(UInt16
的类型别名)。
如果您使用字符串的 utf16
视图迭代您的输入,它将起作用:
let set = NSCharacterSet.letterCharacterSet()
for chr in input.utf16 {
if set.characterIsMember(chr) {
println("\(chr) is a letter")
}
}
如果您只想检查 presence/non-presence:
,也可以跳过循环并使用 contains
算法
if contains(input.utf16, { set.characterIsMember([=11=]) }) {
println("contains letters")
}
您可以通过以下方式使用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
}
In 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
}
就看你的选择了。希望对你有帮助。
您应该将 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"
。
一个不那么灵活但有趣的 swift 注意事项仍然是,您可以使用 Sequence
可用的任何功能。所以你可以这样做:
contains("abc", "c")
这当然只适用于个别角色,不灵活,不推荐。
我正在尝试检查特定字符串是否包含字母。
到目前为止,我遇到的 NSCharacterSet.letterCharacterSet()
是一组字母,但我无法检查该组中的字符是否在给定字符串中。当我使用此代码时,我收到一条错误消息:
'Character' is not convertible to 'unichar'
对于以下代码:
for chr in input{
if letterSet.characterIsMember(chr){
return "Woah, chill out!"
}
}
.characterIsMember
的问题在于它需要 unichar
(UInt16
的类型别名)。
如果您使用字符串的 utf16
视图迭代您的输入,它将起作用:
let set = NSCharacterSet.letterCharacterSet()
for chr in input.utf16 {
if set.characterIsMember(chr) {
println("\(chr) is a letter")
}
}
如果您只想检查 presence/non-presence:
,也可以跳过循环并使用contains
算法
if contains(input.utf16, { set.characterIsMember([=11=]) }) {
println("contains letters")
}
您可以通过以下方式使用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
}
In 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
}
就看你的选择了。希望对你有帮助。
您应该将 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"
。
一个不那么灵活但有趣的 swift 注意事项仍然是,您可以使用 Sequence
可用的任何功能。所以你可以这样做:
contains("abc", "c")
这当然只适用于个别角色,不灵活,不推荐。