为什么Swift隐式解包可选的`nil`?

Yer*_*erk 3 optional swift

self.presentTextInputControllerWithSuggestions(nil, allowedInputMode: WKTextInputMode.Plain) { (results:[AnyObject]!) -> Void in
    // results can be nil
    if let speech = results.first as? String {
        debugPrint(speech)
    }
}
Run Code Online (Sandbox Code Playgroud)

请原谅我的无知,我担心我错过了对选项的一些基本理解.我的印象是!,隐含的未包装的可选指标是保证该类型的变量不是零.然而,这种非常简单的Apple API很少会让我回归nil.

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

Air*_*ity 7

我的印象是!,隐含的未包装的可选指标是保证该类型的变量不是零.

我害怕这是一种错误的印象.隐式解包的选项可以非常多nil.只有未使用任何可选限定符声明的内容,?或者也不!保证是非nil.

所以:

var definitelyCouldBeNilForcedToCheck: String?
var mightBeNilButProbablyNotBECAREFUL: String!
var definitelyNotEverNil: String
Run Code Online (Sandbox Code Playgroud)

隐式解包的选项有两种用例:

  1. 如果你绝对肯定你的价值不会nil,除非在非常严格的情况下.例如,假设您有一个函数在其可用的初始化程序中执行某些处理.像这样:

    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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当你有一个庞大的Objective-C语料库(比方说,Cocoa或UIKit)时,你不知道什么时候返回某个指针是否可以nil.大多数时候你认为它可能不是,并且让你的API用户不得不经常展开东西真的很烦人,但是再一次,你不确定它不会是零而你想要的他们改为阅读文档.但他们可能会忘记,但你能做什么?最终,您将审核所有函数,然后将它们作为可选项或不可为空的值.