【问题标题】:Why do I get error when I do optional chaining?为什么在执行可选链接时会出错?
【发布时间】:2017-02-06 23:48:34
【问题描述】:
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 一样。据我了解,? 我已经解开了 txtField 和 @987654323 @我有解开的文字,仍然困惑为什么它不起作用

为什么 C 可以工作而 B 不行?没有比 C 行更清洁的方法吗? C线看起来很不吸引人。

【问题讨论】:

  • 应该是@IBOutlet weak var txtField: UITextField!
  • @LeoDabus 哈哈。谢谢。但查看text 属性。为什么这是可选的?我的意思是为什么我 Cmmd+click 它显示 @property (nonatomic, readonly) NSString *text; 它没有显示类似 text:String? 的任何东西 它是如何从 Objective-c 转换为可选的?
  • 我不是 swift 专家,所以我会留下评论而不是答案...didEnterText 需要一个非零值,所以我的理解是选项 B 如果@987654329 @ is nil 甚至不会评估该语句的 .text 部分,因此添加 .text! 并不能解决 nil 文本字段的问题。在选项 C 中,所有编译器看到的是一个“保证”为非零的值,因为整个东西都被包裹在括号中......
  • 请问textingprotocol 是如何定义的?
  • @matt 查看更新

标签: swift optional optional-chaining


【解决方案1】:

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

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

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

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

    delegate!.didEnterText(txtField!.text!)

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

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

【讨论】:

  • 所以基本上你是说非可选将永远不会使用可选,除非它通过使用! 即不是? 来保证,对吧?
  • 我不太明白你的意思。一个简单的事实是,您不能提供 String? 来预期 StringString 隐藏在 String? 中。你必须打开它!您可以使用! 不安全地打开它,也可以使用if let 安全有条件地打开它,但您必须先打开它才能使用它。
  • 您似乎并不完全清楚什么是可选。如果是这样,我的书会帮助你:apeth.com/swiftBook/ch03.html#_optional
  • :) 也许。我以为我知道,但令人困惑的是可选链接部分,但现在看来,如果您尝试通过? 解开一个值,则无法将该值分配给非可选的东西。由于它不保证值 - 它可能仍然为零。
  • ? 的可选链接具有不会崩溃的优点,但它只能以可选链接结束。你仍然需要打开它!它认为这可能是你失踪的事实。
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多