试图确保方法检查Swift

时间:2016-07-27 21:27:14

标签: ios regex swift nsstring

我有一个方法,如果它接收的字符串值包含大写/小写字符或连字符的任意组合,则返回布尔值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
        }
    }

任何人都可以看到我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

你的解决方案非常接近正确。方法中的逻辑是检查名称中的 ANY 字符是否为字母字符。

对于字符串__^&^%%%jdjjdrangeOfCharacterFromSet返回它在集合中找到的第一个字符的范围。因此,它会返回第一个{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以显示问题的表单中。这使得找到原因变得非常容易。