一开始我对强制展开和隐式展开非常困惑。现在,以下是我自学的体会:
没有可用于隐式展开的操作,但有一种称为隐式展开选项的东西。隐式展开选项和普通选项都是选项,区别在于当访问隐式展开选项时,您可以自信地知道引擎盖下有一个有效值并可供使用。如果让绑定或强制展开(!
)操作,普通选项需要来访问可选变量后面的可能值。
总结:
强制展开是在正常选项上执行的操作。
隐式展开选项是选项,通常用于类初始化,使用时将传递不带感叹号的值。
问题:
我说得对吗?如果我的理解不准确,如果你能纠正我,我将不胜感激。
谢啦
我会说不,你画了一个错误的区分:
>
前半部分是正确的;展开当然是您对Optionals所做的事情,而强制展开是一种方法(一种不安全的方法)。
但对于隐式展开的可选项是什么:它是一种标记可选类型的方法,以便为您强制展开(如果您在无法使用该可选项的位置使用该可选项,但如果它已展开,则可以使用该可选项)。
隐式展开的可选值在幕后是一个普通的可选值,但也可以像非可选值一样使用,所以您是正确的。
但是,如果您声明一个值为隐式展开的,这相当于在每次使用时强制展开它。
对于隐式展开选项,有4个主要原因。
1:初始化期间无法定义的常量
2:与Objective-C API交互
3:当应用程序无法从变量nil
4:NSObject
初始化器
可选值是某种类型的容器(Int
,String
,UIColor
,…),它可以包含值(1
,“Hello world”
,.greenColor()
,…)或nil
。
let anOptionalInt: Int? = 1
let anotherOptionalInt: Int? = nil
在Swift中,我们看到一个可选值,我们认为:
好的,这可能包含实际值或nil
这是提取可选
中包含的值的操作。此操作很危险,因为您正在告诉编译器:我确信这个可选值确实包含一个实值,提取它!
let anOptionalInt: Int? = 1
let anInt: Int = anOptionalInt!
现在anInt
包含值1。
如果我们对恰好包含nil
的可选值执行强制展开,我们会得到致命错误
,应用程序确实会崩溃并且无法恢复它。
let anotherOptionalInt: Int? = nil
let anotherInt = anotherOptionalInt!
fatal error: unexpectedly found nil while unwrapping an Optional value
当我们定义隐式展开的可选项时,我们定义了一个容器,它将在每次读取时自动执行强制展开。
var text: String! = "Hello"
如果现在我们读text
let name = text
我们没有得到可选的String
,而是一个普通的String
,因为text
会自动展开它的内容。
但是,文本仍然是可选的,因此我们可以在其中输入nil
值
text = nil
但一旦我们读到它(它包含nil
),我们就会得到一个致命错误,因为我们正在展开一个包含nil
let anotherName = text
fatal error: unexpectedly found nil while unwrapping an Optional value
如果像Apple在Swift编程中所说的隐式展开选项应该总是有一个值,那么为什么不使用非选项来代替呢?我知道非选项不能赋值为nil,但还有其他区别吗?
我正在学习Swift,我对隐式展开选项有疑问。 我有一个返回字符串可选的函数: 以及执行安全展开的if语句,它使用隐式展开可选作为其常量: 在第一行中,apt按照应有的方式展开(结果窗格显示“404”),但在其他两行中,apt没有展开:结果窗格和控制台都显示打印的值是可选的(“404”)和找到的公寓:可选(“404”),为了让404出现在控制台上,我必须使用!符号,如果我理解正确,它只需要手动展开
在Swift 4.0中,以下代码不可编译: 现在我想象是
在编写一个新的swift类时,当(不)使用隐式展开选项而不仅仅是普通选项时,我仍然不是100%舒服。据我所知,如果你从来没有期望它的值为零,那么把它指定为隐式未包装(可选)应该是可以的。如果为nil,则为异常事件,应导致运行时错误。 例如,这个简单的登录视图包含两个text field成员变量: 在上面的类中,emailField和passField都被归类为隐式展开选项,因为我从来没有期望它们在
请原谅我的无知,我恐怕错过了一些基本的选项理解。我的印象是(隐式展开的可选指示符)保证该类型的变量不为零。然而,这个非常简单的Apple API很少会返回我。 这是一个意外的错误还是Optionals规范的一部分?因为如果这是规范的一部分,我不明白为什么会有选项,而不是变量可以存在或。
例如,我有这样的类,而不是在方法中指定字段,我只想隐式地打开选项。 我理解这样做的原因是,当我声明它们时,它们的初始值为,因此我不需要,因为所有类的字段都有初始值。我所需要做的就是确保在尝试访问它们之前为它们分配了一些内容,否则会出现致命错误。 假设我们给这些字段赋值,现在我们用某种方法,我想问的是:为什么我们需要在一个条件函数中使用bool来强制展开它?我可以访问其他隐式展开的选项,甚至是boo