Swift变量声明的含义 [英] Swift variable declaration meaning
问题描述
这两个声明之间有什么区别?哪一个更好?为什么?
What's the difference between these two declarations? Which one is better? Why?
... error = some NSError ...
1.
var newUserInfo: [NSObject: NSObject] = [:]
if let tempUserInfo = error.userInfo as? [NSObject: NSObject] {
newUserInfo = tempUserInfo
}
2.
var newUserInfo: [NSObject: NSObject]
if let tempUserInfo = error.userInfo as? [NSObject: NSObject] {
newUserInfo = tempUserInfo
} else {
newUserInfo = [:]
}
推荐答案
从Swift 1.2开始,您现在可以将let
与延迟分配一起使用,以便可以使用if/else版本:
As of Swift 1.2, you can now use let
with deferred assignment so you can use your if/else version:
let newUserInfo: [NSObject: NSObject]
if let tempUserInfo = error.userInfo as? [NSObject: NSObject] {
newUserInfo = tempUserInfo
} else {
newUserInfo = [:]
}
但是,由于存在无法设置newUserInfo
的路径,因此选项1将不起作用.
However, option 1 will not work, since there is a path where newUserInfo
may not be set.
(请注意,从1.2b1版本开始,此功能不适用于全局变量,仅适用于成员变量和局部变量,以防您在操场上尝试使用此功能)
(note, as of 1.2b1, this doesn't work with global variables, only member and local variables, in case you try this out in a playground)
或者,您可以一次性使用nil-coalescing运算符,如下所示:
Alternatively, you could use the nil-coalescing operator to do it in one go, like this:
let newUserInfo = (error.userInfo as? [NSObject:NSObject]) ?? [:]
Swift 1.2添加了let
的延迟分配,使选项2现在可以与let
一起使用,但还更改了as?
与??
的优先级,需要加括号.
edit: Swift 1.2 added deferred assignment of let
, enabling option 2 to be used with let
now, but also changed the precedence of as?
vs ??
, requiring parens.
1.2之前版本的答案,如果需要类似的代码,则需要迁移:
Pre-1.2 answer in case you have similar code you need to migrate:
如果您问我,两者都不是特别有吸引力.在这两种情况下,您都必须用var
声明newUserInfo
,因为您不是一次性声明和分配它的.
Neither are particularly appealing if you ask me. In both cases, you have to have to declare newUserInfo
with var
, because you're not declaring and assigning it in one go.
我建议:
let newUserInfo = error.userInfo as? [NSObject:NSObject] ?? [:]
这篇关于Swift变量声明的含义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!