转载

Value of optional type ‘String’ not unwrapped error in Swift

新开了 K08-RandomColorization ,刚写了一行代码:

let bgMusic = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Ecstasy", ofType: "mp3")) 

然后就报了一个error:

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

这里 寻得一个不错的答案,翻译及理解如下:

首先,这行代码使用到了 可选链式调用(Optional Chaining) 这个家伙。用人话说,就是 NSBundle.mainBundle().pathForResource("Ecstasy", ofType: "mp3") 要么就是一个 String ,要么就是一个 nil

但是,显然 NSURLfileURLWithPath: 方法不会接受 nil ,只会接受 String 类型的参数,所以编译器就把这个error报出来了。(可以做一个实验,直接写 let bgMusic = NSURL(fileURLWithPath: nil) ,就会发现报 Nil is not compatible with expected argument type ‘String’ 的error。)

解决办法是强制展开 NSBundle.mainBundle().pathForResource("Ecstasy", ofType: "mp3") ,即添加一个 !

let bgMusic = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Ecstasy", ofType: "mp3")!) 

但是,如果所需文件不存在就会导致一个运行时的error,直接挂掉。所以,通常来说最好是用一个可选绑定把它包起来:

if let file = NSBundle.mainBundle().pathForResource("aaa", ofType: "mp3") {     let bgMusic = NSURL(fileURLWithPath: file)     NSLog(bgMusic.absoluteString) } 

这样就可以保证 fileURLWithPath: 只有在文件不为空时才被调用了。完美~

Ref:

  • http://stackoverflow.com/a/25663421/1594792
原文  http://www.calios.gq/2016/03/03/Value-of-optional-type-‘String’-not-unwrapped-error-in-Swift/
正文到此结束
Loading...