Swift变量声明的含义 [英] Swift variable declaration meaning

查看:96
本文介绍了Swift变量声明的含义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这两个声明之间有什么区别?哪一个更好?为什么?

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆