swift - 为什么我在进行可选链接时会出错?

标签 swift option-type optional-chaining

protocol textingprotocol : class {
    func didEnterText (text:String)
}

class secondViewController: UIViewController {    
weak var delegate:textingprotocol?

@IBOutlet weak var txtField: UITextField?

@IBAction func dismissButton(sender: UIButton) {

    delegate!.didEnterText(txtField?.text) // A: doesn't work
    delegate!.didEnterText(txtField?.text!) // B: doesn't work
    delegate!.didEnterText((txtField?.text)!) // C: works

}

答:我不是已经在做可选链接了吗?只有当文本有值时,这条线才会工作,如果没有,那么它就会优雅地失败? 然而它给出了:

Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?

B:即使我遇到上述编译器错误,我确实解包了它,但它仍然不满意它希望它像 C 一样。根据我对 ? 的理解,我已经解包了 txtField和 ! 我有展开的文本,仍然困惑为什么它不起作用

为什么 C 有效而 B 无效?难道没有比 C 行更简洁的方法吗? C线看起来很不吸引人。

最佳答案

didEnterText 不接受 String?。它需要一个 String。因此,您不能使用带有问号的简单可选链接来获取其参数。您必须实际解包为字符串,而不是暂时解包为字符串?-or-nil。

现在,txtField 是一个 Optional,因此您需要将其解包。

UITextField 的 text 属性是可选的,因此您也需要将其解包。

所以最简单的方法是绝对地解开它们:

    delegate!.didEnterText(txtField!.text!)

如果您不想这样做(因为您担心其中之一会为 nil 并使您的应用程序崩溃),您将不得不使用 if let 来保护整个事情:

    if let s = txtField?.text {
        delegate!.didEnterText(s)
    }

关于swift - 为什么我在进行可选链接时会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39756962/

相关文章:

regex - NSRegularExpression 可选返回

python - 如何链接可能在 Python 中返回 None 的属性查找?

swift - 如何初始化 UIButton 子类?

ios - 更改动态字符串中的子字符串颜色

string - Swift nil 可选字符串 = 空字符串

ios - 如何最好地管理 Swift 中的可选数组?

javascript - 这两行代码有什么不同,一个抛出一个错误,另一个没有?

typescript - 导入带有可选链接的模块时出错

swift - 推送 ViewController 时无法传输图像

ios - google ios SDK swift fit bounds