展开Swift可选,无需重新分配

时间:2015-02-25 00:24:21

标签: swift optional

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

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

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

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

甚至只是用同一名称重新定义它:

if let childTitle = childTitle { ... }

我开始想知道是否有一个快捷方式或更高效的执行nil检查的唯一目的是使用现有变量。我想象过:

if let childTitle { ... }

这样的事情是否存在,或者至少是我上述两个临时解决方案的替代方案?

3 个答案:

答案 0 :(得分:13)

没有。您应该打开您的选项,只需使用您提到的同名重新定义它。这样您就不需要创建第二个var。

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

更新: Xcode 7.1.1•Swift 2.1

你也可以使用如下守卫:

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

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

答案 1 :(得分:0)

这是我所知道的唯一选择。

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

但是childTitle仍然是可选的,所以每次使用它时都需要打开它:childTitle!.doSomething()。但它不应该影响性能。

答案 2 :(得分:-1)

我已经养成了重新分配同名的习惯。这消除了提出单独名称的需要,并避免了关于是否应该在任何地方使用新名称的任何混淆。但是,请注意块后的输出:

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

如果需要在block后访问修改后的值,可以将变量赋值给一个新的名字,并将新的名字赋回block内的旧名字:

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