2016-06-21 1 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) -> String'' 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

관련 문제