Swift Optionals 的双重解包

Swift double unwrapping of Optionals

我了解 Swift 中的可选内容,但我刚遇到 ”双重包装可选',如果我不使用两个 '!' Xcode 给出编译器错误

Value of optional type 'String?' not unwrapped; did you mean to use '!' or ‘?'?

我有以下代码,其中 app 的类型为 NSRunningApplication

let name: String = app.localizedName!

为什么我必须使用两个 !?一个不足以解包变量,因为它是 var localizedName: String?.

类型

上下文: Xcode要我用let name: String = app.localizedName!!,否则会报上面的编译错误。 app变量定义如下:

var apps = NSWorkspace().runningApplications.filter{[=12=].activationPolicy == NSApplicationActivationPolicy.Regular}
for app in apps{
    //code posted above
    …
}

所以我知道app不是一个可选的并且总是有一个值,也不是一个可选的应用程序。

P.S。使用快速枚举时有没有办法定义类型?就像 for Foo(app) in apps 其中 apps = [AnyObject].

问题是 NSWorkspace().runningApplications returns AnyObject 数组必须转换为数组 NSRunningApplication:

let apps = NSWorkspace().runningApplications as! [NSRunningApplication]
let filteredApps = apps.filter {
        [=10=].activationPolicy == NSApplicationActivationPolicy.Regular
}
for app in apps {
    let name: String = app.localizedName!
}

原因如下:appAnyObject 类型(id in Objective-C),对 AnyObject 进行任何查找都会引入一层可选性因为对象上可能不存在该方法。 localizedName 本身是可选的,所以你最终有两个级别的可选:如果对象不响应 localizedName,则外部级别为 nil,如果 'localizedName' 是,则内部级别为 nil无。