解包 Swift 可选,无需变量重新分配
Unwrapping Swift optional without variable reassignment
当使用可选绑定解包单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂:
if let childTitle = theItem.getChildItem()?.getTitle() {
...
}
但是,当提供变量作为参数时,我发现自己要么使用:
func someFunction(childTitle: String?) {
if let theChildTitle = childTitle {
...
}
}
甚至只是用相同的名称重新定义它:
if let childTitle = childTitle { ... }
我开始想知道是否有捷径或更有效的执行 nil
检查的唯一目的是使用现有变量。我想象过这样的事情:
if let childTitle { ... }
是否存在类似的东西,或者至少是我上面两个临时解决方案的替代方案?
没有。你应该解开你的选项,只是用你提到的相同名称重新定义它。这样你就不需要创建第二个 var.
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)
}
这是我所知道的唯一选择。
func someFunction(childTitle: String?) {
if childTitle != nil {
...
}
}
但是 childTitle
仍然是一个可选的,所以你每次使用它时都必须打开它:childTitle!.doSomething()
。不过,它应该不会影响性能。
我已经养成了重新分配同一个名字的习惯。这消除了想出一个单独的名称的需要,并避免了关于新名称是否应该在任何地方使用的任何混淆。但是,请注意块后的输出:
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"
当使用可选绑定解包单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂:
if let childTitle = theItem.getChildItem()?.getTitle() {
...
}
但是,当提供变量作为参数时,我发现自己要么使用:
func someFunction(childTitle: String?) {
if let theChildTitle = childTitle {
...
}
}
甚至只是用相同的名称重新定义它:
if let childTitle = childTitle { ... }
我开始想知道是否有捷径或更有效的执行 nil
检查的唯一目的是使用现有变量。我想象过这样的事情:
if let childTitle { ... }
是否存在类似的东西,或者至少是我上面两个临时解决方案的替代方案?
没有。你应该解开你的选项,只是用你提到的相同名称重新定义它。这样你就不需要创建第二个 var.
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)
}
这是我所知道的唯一选择。
func someFunction(childTitle: String?) {
if childTitle != nil {
...
}
}
但是 childTitle
仍然是一个可选的,所以你每次使用它时都必须打开它:childTitle!.doSomething()
。不过,它应该不会影响性能。
我已经养成了重新分配同一个名字的习惯。这消除了想出一个单独的名称的需要,并避免了关于新名称是否应该在任何地方使用的任何混淆。但是,请注意块后的输出:
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"