即使值为 nil,Guard Let 语句也不会触发

Posted

技术标签:

【中文标题】即使值为 nil,Guard Let 语句也不会触发【英文标题】:Guard Let statement not triggering even when values are nil 【发布时间】:2020-12-07 20:32:23 【问题描述】:

这是我拥有的 UIBarButtonItem:

@IBAction func doneButtonPressed(_ sender: UIBarButtonItem) 
    print("doneButton Pressed")
    // Guard statement ensures that all fields have been satisfied, so that the JumpSpotAnnotation can be made, and no values are nil
    guard let name = nameTextField.text,
        let estimatedHeight = estimatedHeightTextField.text,
        let locationDescription = descriptionTextView.text else 
            nameRequiredLabel.isHidden = false
            heightRequiredLabel.isHidden = false
            descriptionRequiredLabel.isHidden = false
            print("User did not put in all the required information.")
            return
           

IBAction 中它下面的代码无关紧要,因为这是一个守卫问题。即使我将值设置为 nil,它也不会触发。在我的 viewDidLoad 中我放了:

    nameTextField.text = nil
    estimatedHeightTextField.text = nil
    descriptionTextView.text = nil

当我按下按钮时,在不改变这些文本的值的情况下,guard let 语句仍然没有触发,下面的函数的其余部分将执行。任何想法为什么?谢谢。

【问题讨论】:

单独调试和打印每个值? 刚刚做了,它为所有三个打印了 Optional("") 。我很困惑,我认为守卫的全部意义在于它不能为零。我在做什么错/误解? 如果它们打印Optional(""),它们是空的,而不是零。所以你应该测试第一个guard let name = nameTextField.text, !name.isEmpty else ... @Larme 谢谢,这行得通。欣赏它 UITextField 文本属性默认值为空字符串。即使您在检查其值之前将 nil 分配给它,它也永远不会返回 nil。 BTW UIKeyInput 协议有一个名为hasText 的属性正是为此目的。 【参考方案1】:

UITextField 文本属性默认值为emptyString。它永远不会返回nil,即使你在检查它的值之前给它分配了 nil。顺便说一句,UIKeyInput 协议有一个名为hasText 的属性正是为此目的。如果您还想避免用户只输入空格和新行,您可以在检查它是否为空之前修剪它们。您可以扩展 UITextInput 并实现您自己的 isEmpty 属性。这将涵盖 UITextFieldUITextView 的单一实现:

extension UITextInput 
    var isEmpty: Bool 
        guard let textRange = self.textRange(from: beginningOfDocument, to: endOfDocument) else  return true 
        return text(in: textRange)?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == true
    


let textField = UITextField()
textField.text = " \n "
textField.isEmpty   // true

let textView = UITextView()
textView.text = " \n a"
textView.isEmpty   // true

【讨论】:

【参考方案2】:

如果您只是检查文本字段是否为空,那么您可以执行以下操作:

guard 
    let estimatedHeight = estimatedHeightTextField.text, 
    !estimatedHeight.isEmpty, 
    let locationDescription = descriptionTextView.text,
    !locationDescription.isEmpty 
    else 
        nameRequiredLabel.isHidden = false
        heightRequiredLabel.isHidden = false
        descriptionRequiredLabel.isHidden = false
        print("User did not put in all the required information.")
        return
    

查看这个答案:https://***.com/a/24102758/12761873

【讨论】:

以上是关于即使值为 nil,Guard Let 语句也不会触发的主要内容,如果未能解决你的问题,请参考以下文章

当内容为 nil 时,Swift 保护语句不会返回

Swift的Guard语句

传入值为 nil 的函数参数的默认值

swift中 if let 与 guard let 对比,guard会降低一个分支

Swift - guard关键字(守护)

如何检查零值?即使考虑了 nil 值,应用程序也会崩溃。斯威夫特 [重复]