检查UITextField是否仅是字符/数字

问题描述

我有这段代码。...

let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ0123456789-")
        if itemDescription.text!.rangeOfCharacter(from: characterset.inverted) != nil {
            print("string contains special characters")
            let message = MDCSnackbarMessage()
            message.text = "Numbers and letters only."
            MDCSnackbarManager.show(message)
            progressView.isHidden = true
            buttonSearchOutlet.isHidden = false
        }

无论我输入什么内容,我都会显示小吃栏。我希望这些都是错误

Hello
hello
hello1
hello-

我希望这是真的

Hello!
hello's
hello1@
hello$&@#

我做错了什么?

解决方法

您可以简单地检查所有字符是否都满足条件,并检查包含有效字符的字符串是否包含这些字符。

extension StringProtocol {
    var isLetterDigitOrHyphen: Bool {
        allSatisfy("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-".contains)
    }
}

用法:

let str = "Hello"
if str.isLetterDigitOrHyphen {
    print("string is ok")
} else {
    print("string contains special characters")
}

"Hello".isLetterDigitOrHyphen  // true
"hello".isLetterDigitOrHyphen  // true
"hello1".isLetterDigitOrHyphen  // true
"hello-".isLetterDigitOrHyphen  // true

"Hello!".isLetterDigitOrHyphen  // false
"hello's".isLetterDigitOrHyphen  // false
"hello1@".isLetterDigitOrHyphen  // false
"hello$&@#".isLetterDigitOrHyphen  // false

如果您想使用正则表达式:

extension StringProtocol {
    var isLetterDigitOrHyphen: Bool {
        range(of:"^[a-zA-Z0-9-]{1,}$",options: .regularExpression) != nil
    }
}

或使用字符集:

extension StringProtocol {
    var isLetterDigitOrHyphen: Bool {
        unicodeScalars.allSatisfy(CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-").contains)
    }
}

如果您愿意,您当然可以简单地取反结果

extension String {
    static let validCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
}

extension StringProtocol {
    var isNotLetterDigitOrHyphen: Bool {
        !unicodeScalars.allSatisfy(CharacterSet(charactersIn: .validCharacters).contains)
    }
}