快速双重打开Optionals

时间:2015-03-30 16:29:28

标签: xcode swift optional

我理解Swift中的可选项,但我刚遇到“Double Wrapped Optional”,如果我不使用两个'!' Xcode会出现编译器错误

  

可选类型的值'字符串?'没有打开;你的意思是使用'!'或'?'?

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

let name: String = app.localizedName!

为什么我必须使用两个!?打开变量是不够的,因为它的类型为var localizedName: String?

上下文 Xcode希望我使用let name: String = app.localizedName!!,否则它会给出上面的编译错误。 app变量定义如下:

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

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

P.S。有没有办法在使用快速枚举时定义类型?与for Foo(app) in apps一样apps = [AnyObject]

2 个答案:

答案 0 :(得分:4)

问题是NSWorkspace().runningApplications会返回一个 必须被强制转换为数组的AnyObject数组 NSRunningApplication

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

答案 1 :(得分:1)

原因如下:app的类型为AnyObject(Objective-C中为id),对AnyObject执行任何查找都会引入一层可选性,因为这种可能性该方法在对象上不存在。 localizedName本身是可选的,因此最终会有两个可选级别:如果对象不响应localizedName,则外部级别为nil;如果“localizedName”为nil,则内部级别为nil。