我有一个方法,如果它接收的字符串值包含大写/小写字符或连字符的任意组合,则返回布尔值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
}
}
任何人都可以看到我做错了什么吗?
答案 0 :(得分:1)
你的解决方案非常接近正确。方法中的逻辑是检查名称中的 ANY 字符是否为字母字符。
对于字符串__^&^%%%jdjjd
,rangeOfCharacterFromSet
返回它在集合中找到的第一个字符的范围。因此,它会返回第一个{8, 1}
的范围j
。
那么我们如何检查字符串中的 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以显示问题的表单中。这使得找到原因变得非常容易。