【问题标题】:Implicitly unwrapped optional values and using its value if nill隐式展开可选值并在 nil 时使用其值
【发布时间】:2016-03-15 23:03:36
【问题描述】:

Apple 文档对隐式展开可选选项进行了以下说明。

注意

如果一个隐式展开的可选项是 nil 并且您尝试访问它 包装的值,您将触发运行时错误。结果正好 就好像你在一个普通的可选项后面加上一个感叹号一样 不包含值。

到目前为止,一切都很好。但是,如果我们看到任何 UI 属性的引用都是隐式展开的可选。我一直在这样做 -

@IBOutlet weak var lbleemsx: UILabel!

    @IBOutlet weak var nmtxtfld: UITextField!
    override func viewDidLoad()

    {
        super.viewDidLoad()

      lbleemsx.text = nmtxtfld!.text


    }

现在,如果用户没有在文本字段中输入任何内容,nmtxtfld!.text 的值为 nil,并且由于我在代码中使用它的值,所以它应该返回错误,但它没有。为什么会这样?

【问题讨论】:

  • 如果没有输入,text 的值将是"",这在技术上不是nil。它只是一个空字符串。
  • @Arc676 所以我没有使用任何类型的代码来这样做或者是默认情况下。
  • (理论上,我真的不做iOS)如果你尝试获取一个空文本视图的内容,你会得到一个空字符串。这不会使它成为nil。我不确定这是否会在 Swift 中发生变化。
  • 有时在swift中的弱变量会突然释放内存,所以在这个地方使用Strong或检查nil条件来赋值
  • @Anbu.Karthik 好的,但我的问题是根据文档,如果您在代码中使用隐式解包变量的值,并且如果它有 nill 或没有值,那么它应该会导致错误,但是当我的文本字段的文本为空或我的文本字段没有文本时,为什么不会发生这种情况。那为什么我的应用程序不会崩溃?

标签: ios swift uitextfield


【解决方案1】:

你有点困惑。在这种情况下,它是 nmtxtfld - UITextField 实例,它是隐式展开的可选实例。此属性不是 nil,因为它是在您从 NIB 文件或情节提要场景中实例化视图控制器时设置的。如果您刚刚分配了一个没有 NIB 或故事板的视图控制器的新实例,那么 nmtxtfld 将为 nil,并且当您尝试访问它时会出现运行时异常。

访问nmtxtfld.text 不会给出运行时异常的原因是,正如其他人在 cmets 和答案中所解释的那样,当 UITextField 为空时,它的 text 属性不是 nil,它是空的字符串""

text 属性是可选的,因此它可以为零,但在这种情况下,您将其分配给UILabeltext 属性,其text 属性也是一个可选的,所以即使nmtxtfld.text nil 分配也是可以的,因为你可以将 nil 分配给一个可选的。

如果 nmtxtfld.text 为 nil 并且您说类似 let aString=nmtxtfld.text! 的内容,那么您将收到运行时异常,因为您已明确解包 nil。

【讨论】:

  • 所以通常文本字段永远不会为零,如果它也是空的。
  • 只有将 nil 赋值给它时才会为 nil。根据文档,文本的默认值为 ""
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多