2016-06-21 9 views
1

コード例では、私は非常に閉鎖本体内側の線var number = numberについて混乱していますswift office documentクロージャ内の変数定義をオーバーライドできますか?

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 
} 

から来ています。どのように同じスコープの変数を "再宣言"できますか?

+2

で に削除されますnumber) - >文字列 'number'パラメータは定数です。だからあなたはそれからvarを作り、それは変更可能になります。スコープ内では、変更可能なものが使用され、もう一方は無視されます。このような「再宣言」は、関数の範囲内でのみ関数パラメータで動作します。 – Moritz

+1

@EricD:これは、関数のパラメータだけでなく、他のローカルスコープでも機能します。 –

+0

@MartinRこの物件に関してスイフト3で何か変更されましたか? – SLN

答えて

2

スコープで定義された定数または変数は、外部スコープで定義された別の定数/変数として同じ名前 を使用できます。その場合、 ローカル変数は外側の変数を「隠す」が、その定義の後にのみ現れる。 新しい変数の初期値は、同じ名前の外部変数 を参照できます。例:

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 
} 

もちろん、ローカル変数の別の名前を選択することもできます。

以前スウィフトのバージョンでは

、あなたが変数として関数パラメータ を宣言することができます:

func digitsum(var n : Int) -> Int 

が、その機能は、スウィフト2.2で廃止されましたし、( `でスウィフト3.

+0

ありがとうございました。あなたの助けによる良い学習 – SLN

関連する問題