展开Swift(可选),无需重新分配变量

kxe2p93d  于 2023-03-07  发布在  Swift
关注(0)|答案(3)|浏览(148)

当使用可选绑定来展开单个方法调用(或使用可选链接来展开长方法调用链)时,语法是清晰易懂的:

if let childTitle = theItem.getChildItem()?.getTitle() {
    ...
}

但是,当提供变量作为参数时,我发现自己要么使用:

func someFunction(childTitle: String?) {
    if let theChildTitle = childTitle {
        ...
    }
}

甚至用同样的名字重新定义它:
if let childTitle = childTitle { ... }
我开始思考是否有一种捷径或更有效的方法来执行nil检查,而这种检查的唯一目的是使用一个现有的变量。
if let childTitle { ... }
是否存在这样的东西,或者至少是我上面两个临时解决方案的替代方案?

jk9hmnmh

jk9hmnmh1#

编辑/更新:* * 超码14·斯威夫特5.7**
swift-evolution proposal SE-0345 if let shorthand for shadowing an existing optional variable

if let childTitle {

}
guard let childTitle else {
    return
}

原答复
不。你应该打开你的可选变量,用你提到的相同的名字重新定义它。这样你就不需要创建第二个变量了。

func someFunction(childTitle: String?) {
    if let childTitle = childTitle {
        ...
    }
}

更新:Xcode 7.1.1、Swift 2.1
您还可以按如下方式使用guard:

func someFunction(childTitle: String?) {
    guard let childTitle = childTitle else {
        return
    }

    // childTitle it is not nil after the guard statement
    print(childTitle)
}
zbsbpyhn

zbsbpyhn2#

这是我知道的唯一选择。

func someFunction(childTitle: String?) {
    if childTitle != nil {
        ...
    }
}

但是childTitle仍然是可选的,所以每次使用它时都必须将其解包:childTitle!.doSomething()。不过,这不会影响性能。

hs1rzwqc

hs1rzwqc3#

我已经养成了重新分配相同名称的习惯,这样就不需要另外指定一个名称,也避免了新名称是否应该在任何地方使用的困惑,但是,请注意代码块后面的输出:

var test: String? = "123"
if var test = test {
    test += "4"
    test += "5"
}
print(test) // prints "123"

如果需要在块之后访问修改后的值,可以将变量赋给一个新名称,然后将新名称赋回块中的旧名称:

var test: String? = "123"
if var testWorking = test {
    testWorking += "4"
    testWorking += "5"
    test = testWorking
}
print(test) // prints "12345"

相关问题