尝试确保方法检查 Swift 中的字母和连字符

Trying to ensure that method checks for alpha and hyphen characters in Swift

我有一个方法,如果接收到的字符串值包含 upper/lowercase 个字符或连字符的任意组合,并且 returns 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
        }
    }

谁能看出我做错了什么?

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

对于字符串 __^&^%%%jdjjdrangeOfCharacterFromSet 返回它在集合中找到的第一个字符的范围。所以它 returns 第一个 j 的范围 {8, 1}

那么我们如何检查字符串中的 ALL 个字符呢?您可以遍历每个字符,但这看起来工作量很大。

我的解决方案是获取您不需要的字符集,然后检查 none 个字符是否在该集中。

func isNameValid(name: String) -> Bool {
    let characterSetNotAllowed = NSCharacterSet(charactersInString: alphaCharacters).invertedSet
    if let _ = name.rangeOfCharacterFromSet(characterSetNotAllowed, options: .CaseInsensitiveSearch) {
        return false
    } else {
        return true
    }
}

另外,感谢您将您的代码放在一个可以轻松放入 Playground 中以显示问题的表单中。这使得查找原因变得非常容易。