我有一个方法,如果接收到的字符串值包含大写/小写字符或连字符的任意组合,则返回 bool 值 true,如果包含任何数字或特殊字符,则返回 false (即包含上述字符集之外的任何内容)。不幸的是,我有以下方法没有这样做:
let alphaCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"
if self.isNameValid("joe-bYlow") {
print("correct")
} //passes
if self.isNameValid("YYYYY") {
print("correct")
} //passes
if self.isNameValid("8888ja;sdf") {
print ("wrong")
} //fails i.e. it prints "wrong"
if self.isNameValid("__^&^%%%jdjjd") {
print ("wrong")
} //fails i.e. it prints "wrong"
if self.isNameValid("9999") {
print("also wrong")
} //passes
if self.isNameValid("blahBlah8") {
print("wrong")
} //fails i.e. it prints "wrong"
if self.isNameValid("Frank") {
print("correct")
} //passes
func isNameValid(name: String) -> Bool {
let characterSetAllowed = NSCharacterSet(charactersInString: alphaCharacters)
if let _ = name.rangeOfCharacterFromSet(characterSetAllowed, options: .CaseInsensitiveSearch) {
return true
} else {
return false
}
}
谁能看出我做错了什么?
最佳答案
您的解决方案非常接近正确。您方法中的逻辑是检查名称中的任何字符是否为字母字符。
对于字符串 __^&^%%%jdjjd
,rangeOfCharacterFromSet
返回它在集合中找到的第一个字符的范围。因此它返回第一个 j
的范围 {8, 1}
。
那么我们如何检查字符串中的ALL 字符呢?您可以遍历每个字符,但这看起来工作量很大。
我的解决方案是获取您不需要的一组字符,然后检查该组中没有任何字符。
func isNameValid(name: String) -> Bool {
let characterSetNotAllowed = NSCharacterSet(charactersInString: alphaCharacters).invertedSet
if let _ = name.rangeOfCharacterFromSet(characterSetNotAllowed, options: .CaseInsensitiveSearch) {
return false
} else {
return true
}
}
另外,感谢您将您的代码放在一个可以轻松放入 Playground 中以显示问题的表单中。这使得查找原因变得非常容易。
关于ios - 尝试确保方法检查 Swift 中的字母和连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38623469/