Swift 使用未解析的运算符“=~”

Swift Use of unresolved operator '=~'

我试图找到 swift 密码强度检查器的代码,然后我看到 this from github 我修复了一些代码,但有一个运算符我不明白,它是 =~

这是我的代码

enum PasswordStrength: Int {
    case None
    case Weak
    case Moderate
    case Strong
    static func checkStrength(password: String) -> PasswordStrength {
        var len: Int = password.count
        var strength: Int = 0
        switch len {
        case 0:
            return .None
        case 1...4:
            strength += 1
        case 5...8:
            strength += 2
        default:
            strength += 3
        }
        // Upper case, Lower case, Number & Symbols
        let patterns = ["^(?=.*[A-Z]).*$", "^(?=.*[a-z]).*$", "^(?=.*[0-9]).*$", "^(?=.*[!@#%&-_=:;\"'<>,`~\*\?\+\[\]\(\)\{\}\^\$\|\\\.\/]).*$"]
        for pattern in patterns {
            if (password =~ pattern).boolValue {
                strength += 1
            }
        }
        switch strength {
        case 0:
            return .None
        case 1...3:
            return .Weak
        case 4...6:
            return .Moderate
        default:
            return .Strong
        }
    }
}

我的错误 Use of unresolved operator '=~' 指向 =~,这是什么意思,我该如何解决?

=~ 似乎是一个自定义运算符(或者模式匹配运算符 ~= 在以前的 Swift 版本中可能有所不同,但我对此表示怀疑,因为模式匹配运算符无法处理正则表达式匹配或至少无法在 Swift 5).

中处理

您可以将 =~ 替换为 if password.range(of: pattern, options: .regularExpression) != nil 以检查正则表达式是否与您的密码匹配。

此外,enum 个案例应该是 lowerCamelCase

完整的工作代码:

enum PasswordStrength: Int {
    case none
    case weak
    case moderate
    case strong

    static func checkStrength(password: String) -> PasswordStrength {
        let len = password.count
        var strength: Int = 0
        switch len {
        case 0:
            return .none
        case 1...4:
            strength += 1
        case 5...8:
            strength += 2
        default:
            strength += 3
        }
        // Upper case, Lower case, Number & Symbols
        let patterns = ["^(?=.*[A-Z]).*$", "^(?=.*[a-z]).*$", "^(?=.*[0-9]).*$", "^(?=.*[!@#%&-_=:;\"'<>,`~\*\?\+\[\]\(\)\{\}\^\$\|\\\.\/]).*$"]
        for pattern in patterns {
            if password.range(of: pattern, options: .regularExpression) != nil {
                strength += 1
            }
        }
        switch strength {
        case 0:
            return .none
        case 1...3:
            return .weak
        case 4...6:
            return .moderate
        default:
            return .strong
        }
    }
}

您还可以使用这样的 where 子句来简化 for 循环:

for pattern in patterns where password.range(of: pattern, options: .regularExpression) != nil {
    strength += 1
}