当前位置: 首页 > 知识库问答 >
问题:

强制展开选项和隐式展开选项之间的区别

柳飞飙
2023-03-14

一开始我对强制展开和隐式展开非常困惑。现在,以下是我自学的体会:

没有可用于隐式展开的操作,但有一种称为隐式展开选项的东西。隐式展开选项和普通选项都是选项,区别在于当访问隐式展开选项时,您可以自信地知道引擎盖下有一个有效值并可供使用。如果让绑定或强制展开()操作,普通选项需要来访问可选变量后面的可能值。

总结:

强制展开是在正常选项上执行的操作。

隐式展开选项是选项,通常用于类初始化,使用时将传递不带感叹号的值。

问题:

我说得对吗?如果我的理解不准确,如果你能纠正我,我将不胜感激。

谢啦


共有3个答案

卫博
2023-03-14

我会说不,你画了一个错误的区分:

>

  • 前半部分是正确的;展开当然是您对Optionals所做的事情,而强制展开是一种方法(一种不安全的方法)。

    但对于隐式展开的可选项是什么:它是一种标记可选类型的方法,以便为您强制展开(如果您在无法使用该可选项的位置使用该可选项,但如果它已展开,则可以使用该可选项)。

  • 国阳
    2023-03-14

    隐式展开的可选值在幕后是一个普通的可选值,但也可以像非可选值一样使用,所以您是正确的。

    但是,如果您声明一个值为隐式展开的,这相当于在每次使用时强制展开它。

    对于隐式展开选项,有4个主要原因。

    1:初始化期间无法定义的常量

    2:与Objective-C API交互

    3:当应用程序无法从变量nil

    4:NSObject初始化器

    司寇旺
    2023-03-14

    可选值是某种类型的容器(IntStringUIColor,…),它可以包含值(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