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/