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行看起来非常缺乏吸引力。
答案 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)
}