SLN*_*SLN 25 optional swift forced-unwrapping
我最初对强行展开和隐式展开非常困惑.现在,以下理解来自我的自学:
有没有可用的隐含解包的动作,但有一些所谓的隐式解开选配.隐式解包的Optionals和普通的Optionals都是Optionals,区别在于访问一个隐式解包的Optional时,你自信地知道底层有一个有效的值并且可以使用.Normal Optionals需要if let绑定或强制unwrapping(!)动作来访问可选变量后面的可能值.
摘要:
强迫去包裹是一个行动的正常选配完成.
隐式解包的Optionals是 Optionals,通常用于类初始化,并在使用时传递没有感叹号的值.
问题:
我对吗?如果我的理解不准确,如果你纠正我,我将不胜感激.
谢谢
Luc*_*tti 77
可选的值是一个容器的一些类型(Int,String,UIColor,...),它可以包含值(1,"Hello world",.greenColor(),...)或nil.
let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
Run Code Online (Sandbox Code Playgroud)
在Swift中,我们看到一个我们认为的可选值:
好的,这可能包含实际价值或
nil
这是提取内部包含的值的动作Optional.这个操作很危险,因为你告诉编译器:我确定这个Optional值确实包含一个实际值,然后解压它!
let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
Run Code Online (Sandbox Code Playgroud)
现在anInt包含值1.
如果我们对包含nil我们得到的可选值执行强制解包fatalError,则应用程序会崩溃并且无法恢复它.
let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!
fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)
当我们定义一个Implicitly unwrapped可选项时,我们定义一个容器,每次读取它时都会自动执行一次强制解包.
var text: String! = "Hello"
Run Code Online (Sandbox Code Playgroud)
如果现在我们读 text
let name = text
Run Code Online (Sandbox Code Playgroud)
我们没有得到一个可选的String但是普通的,String因为text它自动解开它的内容.
但是文本仍然是可选的,因此我们可以nil在其中放置一个值
text = nil
Run Code Online (Sandbox Code Playgroud)
但是一旦我们读到它(并且它包含nil),我们就会得到一个致命的错误,因为我们正在解包一个可选的包含nil
let anotherName = text
fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)
隐式展开可选的是幕后正常可选的,但也可以像非可选值使用,所以是的,你是正确的.
但是如果你声明一个值是隐式展开的,那么它相当于强制在每次使用时展开它.
对于隐式解包的选项,有4个主要原因可以做到这一点.
1:初始化期间无法定义的常量
2:与Objective-C API交互
3:当你的应用程序无法从变量存在中恢复时 nil
4:NSObject初始化器