这是测试字段是否留空的正确方法吗?

Is this the right way to test if a field has been left empty?

这是在函数内部,因此作为参数传递的任何文本字段都可以响应方法 checkForEmptyFields:

textField.addTarget(self, action: #selector(checkForEmptyFields(sender:)), 
for: UIControlEvents.editingChanged)

这是方法checkForEmptyFields:

 func checkForEmptyFields(sender:UITextField){

        self.loginButton.isEnabled = (sender.text?.trim().isEmpty)! == false

    }

这是用于管理修剪的字符串的简单扩展:

extension String
{
    func trim() -> String
    {
        return self.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
    }
}

似乎一切正常,但我想知道这是否是正确的方法,以及我是否忘记了一些重要的事情(或者我犯了任何错误)。谢谢!

确保文本不为零可能会更安全。

func checkForEmptyFields(sender: UITextField) {
    let isTextEmpty = sender.text?.trim().isEmpty ?? true
    self.loginButton.isEnabled = !isTextEmpty
}

不过您的整体方法似乎还不错。


正如@matt 在评论中所建议的那样,可以将一些这种行为封装到 UITextField 的扩展中。

extension UITextField {
    var isEmpty: Bool {
        return self.text?.trim().isEmpty ?? true
    }
}

您的函数可以简化为:

func checkForEmptyFields(sender: UITextField) {
    self.loginButton.isEnabled = !sender.isEmpty
}

旁注:扩展的 "Swiftier" 名称是 trimmed(),因为它返回一个新的 String 实例。这符合 Swift API Design Guidelines.

根据我上面的评论,不要强行解包。真的!

我可能会这样处理……

func checkForEmptyFields(sender: UITextField) {
    if let trimmedText = sender.text?.trim(), !trimmedText.isEmpty {
        loginButton.isEnabled = true
    } else {
        loginButton.isEnabled = false
    }
}

它更冗长,但我认为这清楚地表明了您的意图 - 零合并有时会混淆阅读和调试(应该是 ?? true 还是 ?? false?)