[swift]您可以重写内闭包变量的定义吗?

标签: Swift
发布时间: 2017/3/6 22:58:32
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

该代码示例来自 swift office 文档

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

let strings = numbers.map {
    (number) -> String in
    var number = number //What is this!
    var output = ""
    while number > 0 {
        output = digitNames[number % 10]! + output
        number /= 10
}    
    return output
}

我很疑惑线 var number = number 封闭体内。你如何"重新声明"具有相同的作用域的变量?

解决方法 1:

常量或在范围内定义的变量可以作为另一个常量/变量定义在外部范围使用相同的名称。在这种情况下,本地变量"隐藏"外面的一个,但只后其定义。 新变量的初值可以引用外部变量具有相同的名称。示例︰

func foo() {
    let x = 5
    do {
        var x = x
        //      ^-- The value of the outer constant `x`
        //  ^------ The local variable x
        x += 1
        print(x) // 6
    }
    print(x) // 5
}

一个常见的用例是复印"变量"的函数参数︰

func digitsum(n : Int) -> Int {
    var s = 0
    var n = n
    while n > 0 {
        s += n % 10
        n /= 10
    }
    return s
}

和同样发生在你关闭︰

let strings = numbers.map {
    (number) -> String in
    var number = number
    //           ^-- The number that the closure was called with
    //  ^----------- A local variable `number`
    var output = ""
    while number > 0 {
        output = digitNames[number % 10]! + output
        number /= 10
    }    
    return output
}

当然你也可以选择一个不同的名称为本地变量。

在早些时候 Swift 版本,您可以声明一个变量作为函数参数︰

func digitsum(var n : Int) -> Int

该功能在中已弃用,但 Swift 2.2 和中将删除 Swift 3。

赞助商