什么是解包变量?

Posted

技术标签:

【中文标题】什么是解包变量?【英文标题】:What is to unwrap a variable? 【发布时间】:2016-09-09 23:50:09 【问题描述】:

我一直在尝试理解可选项和隐式展开的可选项的概念,但我就是不明白术语?我的问题是:

    编程包含什么?包装好的字符串是什么? 什么是展开? 可选 (?) 和隐式展开的函数 (!) 之间有什么区别 什么时候使用?或! 隐式在隐式展开可选术语中是什么意思?

展开是否只是揭示变量的真实值,无论它是 nil 还是值?

【问题讨论】:

What does an exclamation mark mean in the Swift language?的可能重复 "您在值可能不存在的情况下使用可选项。可选项代表两种可能性:要么有一个值,您可以打开可选项以访问该值,或者没有完全有价值。”请参阅可选讨论:developer.apple.com/library/prerelease/content/documentation/… 这样的问题对于ios/swift的初学者来说很有参考价值!好问题 【参考方案1】:

1.Wrapped 意味着您将值放在一个变量中,该变量可能为空。例如:

let message: String? // message can be nil
message = "Hello World!" // the value "Hello World!" is wrapped inside the message variable.

print(message)  // print the value that is wrapped in message - it can be null.

2.Unwrap的意思是你得到变量的值来使用它。

textField?.text = "Hello World!" // you get the value of text field and set text to "Hello World!" if textField is not nil.
textField!.text = "Hello World!" // force unwrap the value of text field and set text to "Hello World!" if text field is not nil, other wise, the application will crash. (you want to make sure that textField muse exists).

3.Optional:是一个可以为nil的变量。当你使用它的值时,你需要明确地解开它:

let textField: UITextField? // this is optional
textField?.text = "Hello World" // explicitly tells the compiler to unwrap it by putting an "?" here
textField!.text = "Hello World" // explicitly tells the compiler to unwrap it by putting in "!" here.

隐式展开 optional(?) 是一个可选项(值可以是 nil)。但是当你使用它时,你不必告诉编译器解包它。它将被强制隐式解包(默认)

let textField: UITextField!
textField.text = "Hello World!" // it will forced unwrap the variable and the program will crash if the textField is nil.

4.如果您认为该值可以为零,请尝试在大多数情况下始终使用 optional(?)。仅当您 100% 确定变量在使用时不能为 nil 时才使用隐式展开的 optional(!)(但您不能在 Class 构造函数中设置它)。

5.Implicitly 表示自动,你不必告诉编译器,它会自动执行,这很糟糕,因为有时你不知道你正在解开一个可能导致程序崩溃的可选项。在编程中,显式总是比隐式好。

【讨论】:

非常好的解释谢谢。但是,当我可以仅使用包装的文本字段(例如 textField?.text 例如,如果您确定 textField 不为零,当您想要获取 String 而不是 String?。例如:let message = textField?.text -> 返回字符串?但是let message = textField!.text -> 返回字符串。更安全的方式应该是let message = textField?.text ?? "" 或者你可以使用if let messageText = textField?.text // 会更安全。

以上是关于什么是解包变量?的主要内容,如果未能解决你的问题,请参考以下文章

Python

Firebase使用电子邮件和密码创建用户给我字符串必须是解包错误

为啥 Visual Studio 2010 不“解包”系统变量?

练习13--参数,解包,变量

在python中将值解包到多个变量中

习题13 参数解包和变量