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

Why do I get error when I do 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。因此,您不能使用带有问号的简单可选链接来获取其参数。您必须实际解包为String,而不是暂时解包为String?-or-nil。

现在,txtField 是可选的,因此您需要将其解包。

而 UITextField 的 text 属性 是可选的,因此您也需要将其展开。

所以最简单的方法就是将它们都展开,绝对是:

    delegate!.didEnterText(txtField!.text!)

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

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