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

为什么Swift隐式展开选项为“nil”?

万俟鸿波
2023-03-14
self.presentTextInputControllerWithSuggestions(nil, allowedInputMode: WKTextInputMode.Plain) { (results:[AnyObject]!) -> Void in
    // results can be nil
    if let speech = results.first as? String {
        debugPrint(speech)
    }
}

请原谅我的无知,我恐怕错过了一些基本的选项理解。我的印象是(隐式展开的可选指示符)保证该类型的变量不为零。然而,这个非常简单的Apple API很少会返回我nil

这是一个意外的错误还是Optionals规范的一部分?因为如果这是规范的一部分,我不明白为什么会有选项,而不是变量可以存在或nil

共有3个答案

皮弘博
2023-03-14

不,这个符号 不能保证变量不是零。

swift中的选项很棘手。

假设您有以下字符串类型的变量

var name: String?

这不是一根绳子。这是一个可选字符串,这是另一回事。

然而,以下几点:

var name: String!

是一个隐式展开的可选项,这意味着调用名称将始终给出字符串,而不是可能为nil的可选字符串

如果希望代码在可选项为nil时崩溃,通常使用隐式展开可选项。

浦琪
2023-03-14

每当你看到一个带有方法签名 nil

在大多数情况下,参数将是隐式展开的可选项,因为它来自一个尚未更新以说明Objective-C可空性注释的Objective-C库(Objective-C源代码文件用于告诉Swift参数是否应该是可选的)。

Objective-C不支持optionals的想法。

如果这是来自Apple库,那么他们发布Xcode更新来解决这个问题并将参数更改为非可选或可选参数只是时间问题。苹果没有在其参数中保留任何隐含未包装选项的长期计划。

澹台衡
2023-03-14

我的印象是(隐式展开的可选指示符)保证该类型的变量不为零。

恐怕这是一个错误的印象。隐式展开的选项很可能是nil。只有没有用任何可选限定符声明的东西,既不是也不是,才保证是非nil

所以:

var definitelyCouldBeNilForcedToCheck: String?
var mightBeNilButProbablyNotBECAREFUL: String!
var definitelyNotEverNil: String

隐式展开选项有两个用例:

>

  • 当你绝对肯定你的价值不会为零时,除非是在非常可控的情况下。例如,假设您有一个函数,它在可失败的初始值设定项中进行了一些处理。这样地:

    class FileHandler {
        let fileHandle: SomeFileHandleType!
    
        init?(fileName: String) {
            fileHandle = open(fileName)
            if fileHandle == nil { return nil }
        }
    
        deinit {
            if fileHandle != nil {
                fileHandle.close()
            }
        }
    
        func variousMethods() {
            // can just use fileHandle without bothering about
            // unwrapping it, because it cannot possibly be nil
            // based on how you’ve written your code
        }
    }
    

    当你有大量的Objective-C(比如Cocoa或UIKit)时,你不知道什么时候返回某个指针,它是否可以是nil。大多数情况下,你认为它可能不是,让你的API用户不断地打开东西真的很烦人,但是,你也不确定它不可能是零,你希望他们阅读文档。但他们可能会忘记,但你能做什么?最终,您将审核所有函数,然后将它们设置为可选值或不可为空的值。

  •  类似资料:
    • 例如,我有这样的类,而不是在方法中指定字段,我只想隐式地打开选项。 我理解这样做的原因是,当我声明它们时,它们的初始值为,因此我不需要,因为所有类的字段都有初始值。我所需要做的就是确保在尝试访问它们之前为它们分配了一些内容,否则会出现致命错误。 假设我们给这些字段赋值,现在我们用某种方法,我想问的是:为什么我们需要在一个条件函数中使用bool来强制展开它?我可以访问其他隐式展开的选项,甚至是boo

    • 在编写一个新的swift类时,当(不)使用隐式展开选项而不仅仅是普通选项时,我仍然不是100%舒服。据我所知,如果你从来没有期望它的值为零,那么把它指定为隐式未包装(可选)应该是可以的。如果为nil,则为异常事件,应导致运行时错误。 例如,这个简单的登录视图包含两个text field成员变量: 在上面的类中,emailField和passField都被归类为隐式展开选项,因为我从来没有期望它们在

    • 我正在学习Swift,我对隐式展开选项有疑问。 我有一个返回字符串可选的函数: 以及执行安全展开的if语句,它使用隐式展开可选作为其常量: 在第一行中,apt按照应有的方式展开(结果窗格显示“404”),但在其他两行中,apt没有展开:结果窗格和控制台都显示打印的值是可选的(“404”)和找到的公寓:可选(“404”),为了让404出现在控制台上,我必须使用!符号,如果我理解正确,它只需要手动展开

    • 一开始我对强制展开和隐式展开非常困惑。现在,以下是我自学的体会: 没有可用于隐式展开的操作,但有一种称为隐式展开选项的东西。隐式展开选项和普通选项都是选项,区别在于当访问隐式展开选项时,您可以自信地知道引擎盖下有一个有效值并可供使用。如果让绑定或强制展开()操作,普通选项需要

    • 所以我问了这个问题,看起来原因是 之所以不起作用,是因为操作符采用了inout参数,而隐式取消包装的选项不是。然而,在 操作符与隐式unwrapped选项一起工作,这意味着二进制操作符不需要inout参数。所以我的问题是,为什么一元运算符和二元运算符有不同的参数要求?对我来说,能够使用Int似乎有点傻

    • 问题内容: 为什么只创建一个正则变量或常量而不是创建一个“隐式展开的可选”?如果您知道可以成功解包,那么为什么首先要创建一个可选的?例如,为什么这样: 比以下内容更有用: 如果“可选参数指示允许常量或变量具有’无值’”,但“有时从程序的结构中可以看出,可选参数在首次设置该值后将始终具有一个值”,这是什么意思呢?首先使它成为可选项?如果您知道可选值总是会有一个值,那不是使它成为非可选值吗? 问题答案