任何单行代码来实现"if let"然后比较(例如字符串比较)?



我正在对同事的 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 的值是一个可选字符串,这可以直接与非可选字符串进行比较。

最新更新