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

时间:2016-09-28 20:22:00

标签: swift optional 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

}

答:我还没有做可选链接,只有当文本有值时,该行才有效,否则会优雅地失败? 但它给出了:

  

可选类型的值'字符串?'没有打开;你的意思是用吗?   '!'或者'?'?

B:即使我给出了上面的编译错误,我也解开它,仍然不满意它希望它像C一样。我对?的理解我已经解开了txtField和!我有解包的文字,仍然混淆为什么它不起作用

为什么C工作但不是B?难道没有比C线更清洁的方式吗? C行看起来非常缺乏吸引力。

1 个答案:

答案 0 :(得分:2)

didEnterText不接受String?。它需要String。因此,您不能使用带问号的简单可选链接来获取其参数。您必须实际解包到String,而不是暂时展开到String? - 或 - nil。

现在,txtField是一个可选项,因此您需要打开它。

UITextField的text属性是可选的,因此您也需要打开它。

所以最简单的方法是打开它们两个,绝对:

    delegate!.didEnterText(txtField!.text!)

如果您不想这样做(因为您担心其中一个会为零而且会崩溃您的应用),您必须使用if let来保护整个事情:

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