我理解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]
。
答案 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。