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