0
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

}

A:我是否还没有进行可选链接,并且该行仅在文本具有值时才有效,否则它将优雅地失败?然而它给出了:

可选类型“字符串?”的值 未拆封;你的意思是用'!' 或者 '?'?

B:即使我得到上述编译器错误,我确实解开了它,但它仍然不满意它希望它像?C!它不起作用

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

4

1 回答 1

2

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

现在,txtField是一个可选的,所以你需要解开它。

UITextField 的text属性是可选的,所以你也需要解包它。

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

    delegate!.didEnterText(txtField!.text!)

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

    if let s = txtField?.text {
        delegate!.didEnterText(s)
    }
于 2016-09-28T20:52:08.740 回答