我正在对同事的 Swift 代码进行代码审查,并想重构以下代码段:
let status = JSON["status"]
if (status != nil && status as! String == "success") {
...
}
可以使用一行代码来实现吗?
我只能设法让它变成这样:
if let status = JSON["status"] as! String {
if status == "success" {
我希望我能把它变成这样:
if let status = JSON["status"] as! String == "success" {
但它不会编译...有人可以帮忙吗?谢谢。在这种情况下guard
语句有用吗?
我实际上是 Swift 的新手。
if let status = JSON["status"] as? String where status == "success" {
另外,如果您使用 swiftyJSON 库:
if let status = JSON["status"].string where status == "success" {
编辑:进一步解释
当你写的时候
if let status = JSON["success"] as? String
你会得到一个解开包装的字符串,这意味着这将始终有一个值,如果你做另一件事,它将是 Optional("nil"),所以当你使用:
if let status = JSON["success"] where status as? String = ""
您将有一个解包的 JSON 对象,是否是字符串尚未确定,因此当您想使用某种对象类型(在本例中为字符串)时,您会立即在"if let"部分将其向下抛弃,以便您也可以使用字符串函数,以防您想请求布尔值(或其他一些检查)。
在解开可选值后,我从未真正向下转换,但我想它可能会出错,因为您仍然有一个可能为 nil 的可选对象,并且您真的希望在它之前有一个值。
Swift 3
以防万一其他人遇到这个问题,但没有 OP 的特定用例(在以前的 swift 版本中没有尝试过)。您可以将解包和条件分开用逗号分隔:
if let status = JSON["status"] as! String, status == "success" {
您不需要可选的绑定,只需:
if JSON["status"] as? String == "success" {
// ...
}
JSON["status"] as? String
的值是一个可选字符串,这可以直接与非可选字符串进行比较。