【问题标题】:Force unwrapping (UITextField().text!) Not Crash .But (UILabel().text!) Crash强制展开 (UITextField().text!) Not Crash .But (UILabel().text!) Crash
【发布时间】:2018-12-01 16:00:28
【问题描述】:

请检查这个,我需要解释为什么texField.text! 不崩溃和label.text! 崩溃

我们知道UITextField 拥有open var text:String?UILabel 拥有open var text:String? 的属性

 let texField = UITextField() 
 texField.text = nil   

 print(texField.text!) // not crash 

 let label = UILabel() 
 label.text = nil 

print(label.text!) //crash 

【问题讨论】:

    标签: ios swift string uitextfield uilabel


    【解决方案1】:

    来自UITextField的文档

    声明

    var text: String? { get set }

    讨论

    这个字符串默认是@""


    来自UILabel的文档

    声明

    var text: String? { get set }

    讨论

    此属性默认为nil

    请注意细微差别

    【讨论】:

    • 谢谢@vadian。是的,我明白了,所以 UITextField 文本是可选的,具有空值“”,当强制展开时你会得到“”,但是 UILabel 文本是可选的,当强制展开时没有值它会崩溃
    • 看来UITextField 的行为是由一些Objective-C 兼容性引起的。但尽管它是可选的,但它不会是 nil
    • @""中的@是什么意思?
    • @Jim 这是 Objective-C 语义。必须用 @ 前缀标记文字字符串。
    【解决方案2】:

    作为一般经验法则,您永远不应该像这样强制解开可选值。 您应该使用 if-letguard 或 swift 提供的任何方式来安全地处理选项。

    如果标签没有文本,则label.text 将返回 nil。 但是,如果文本字段没有文本,则 textField 将返回 ""(空字符串)。这就是为什么强制解开文本字段的text 属性时它不会崩溃的原因。

    我不确定为什么 Apple 会这样设计,但正如我在上面所写的,您应该安全地处理可选项。

    【讨论】:

    • 是的@abullah,我知道,但我通过这种方式写信询问有什么不同,无论如何谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多