Swift double unwrapping of Optionals

烂漫一生 提交于 2019-12-21 04:07:03

问题


I understand what optional are in Swift but I just encountered a ”Double Wrapped Optional’, where if I don’t use two '!' Xcode gives an complier error

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

I have the following code, where app is of type NSRunningApplication.

let name: String = app.localizedName!

Why should I have to use two !? Isn’t one enough to unwrap the variable because it is of type var localizedName: String?.

Context: Xcode want me to use let name: String = app.localizedName!!, otherwise it gives the compiler error above. The app variable is defined as follow:

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

So I know that app is not an optional and will always have a value, nor is it an optional application.

P.S. Is there a way to define type when using fast enumeration? Like for Foo(app) in apps where apps = [AnyObject].


回答1:


The problem is that NSWorkspace().runningApplications returns an array of AnyObject which has to be cast to an array of NSRunningApplication:

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



回答2:


Here's why: app is of type AnyObject (id in Objective-C), and doing any lookup on AnyObject introduces a layer of optionality because of the possibility that the method doesn’t exist on the object. localizedName is itself Optional, so you end up with two levels of optional: the outer level is nil if the object doesn’t respond to localizedName, and the inner is nil if 'localizedName' is nil.



来源:https://stackoverflow.com/questions/29351438/swift-double-unwrapping-of-optionals

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!