gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 12:39:38 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com