2016-09-28 4 views
0

전역 함수는 이름이 있고 값을 캡처하지 않는 클로저입니다.왜 이것이 클로저 캡처로 계산되지 않습니까?

신속한 기능은 폐쇄의 공간적 형태입니다. 다른 함수는 이름을 가지고 있으며 전역 함수이면 주변 컨텍스트에서 상수와 변수를 캡처 할 수 없습니다.

내가 믿을 :

그러나, 나는 전역 함수는 또한 주변 상황의 상수와 변수를 캡처

let referenceInt = 10 

func addOne() -> Int { 
     return referenceInt + 1 //captured the constant referenceInt 
} 

let fooA = addOne 
let fooB = addOne 
let fooC = addOne 

print(fooA()) //prints 11 
print(fooB()) //prints 11 
print(fooC()) //prints 11, (func addOne captured referenceInt ?) 

print(referenceInt) //prints 10 

문제 (아래 예제 코드 참조) 수 있다는 것을 발견 다음 개념을 완전히 이해하지 못했습니다 :

  1. 단순히 놀이터에서 기능을 정의하십시오 (예 : addOne은() -> 여기에 지능)는 수도가되지는 전역 함수이 경우의 "캡처"잘못된 이해를 갖는

  2. 의미, 이것은 전혀 캡처되지 않습니다 (하지만 왜)

    ? 나는 매우 될 당신은 내가 잘못 이해하고 좀 설명을 줄 수도 좋을 것 어느 부분을 지적 할 수있는 감사하겠습니다

    :

내가 찾고 있어요 도와줍니다.

감사

PS :

이 질문에 그것에 더 깨끗한 대답은 아직 존재하지 않기 때문에 그러나, 나는 아직도 그것을 게시, this one의 중복 될 수 있으며 내 질문이 조금 더 질문을 밀었다. 그러나 여전히 그것을 닫고 싶다면, 나는 그것을 존중하며 당신에게서 배우기를 기꺼이 배웁니다.

답변

1

먼저, 귀하의 전제에 질문 할 것입니다. 클로저는 클로저입니다. Swift의 모든 기능은 클로저이며 모두 동일한 방식으로 캡처됩니다.

둘째, 캡처 또는 종료와 관련하여 코드가 무엇인지 알지 못합니다. 코드에서 아무 것도 캡처되지 않았는지 테스트하는 것은 아닙니다. let fooA = addOne 유형의 지정은 흥미로운 작업을 수행하지 않으며 addOne 내부의 코드는 흥미로운 작업을 수행하지 않습니다. 코드가 실행될 때 단순히 두 개의 값을 추가하는 것입니다. 물론 addOne 내부의 코드는 으로 허용되고을 전역 변수 referenceInt으로 참조하십시오. 이는 범위에 포함되어 있기 때문입니다. 당신은 클로저의 특별한 힘을 이끌어 내기 위해 여기 아무 것도하지 않습니다.

struct Test { 
    var referenceInt = 10 

    func addOne() -> Int { 
     return referenceInt + 1 // capture 
    } 

    mutating func test() { 
     let fooA = self.addOne 
     let fooB = self.addOne 
     let fooC = self.addOne 

     referenceInt = 100 // :) 

     print(fooA()) //prints 11 
     print(fooB()) //prints 11 
     print(fooC()) //prints 11 

     print(referenceInt) //prints 100 
    } 

} 

var t = Test() 
t.test() 

우리는 등등 fooA과를 호출하기 전에referenceInt을 변경 :

여기에 행동에 쇼 캡처를 수행 코드의 수정입니다.fooA을 호출해도 self.referenceInt 값이 으로 캡처되었으므로 전에 referenceInt으로 변경되었습니다.

+0

클로저가 흥미롭고 실제로 캡처해야하는 이유를 보려면 내 책을 읽는 것이 도움이 될 것입니다. 여기에서 시작하십시오 : http://www.apeth.com/swiftBook/ch02.html#_closures – matt

+0

친애하는 여러분, 매트, 내 문제를 지적했다고 생각해. 네, 저는 그 닫음을 완전히 이해하지 못했으며 전혀 닫히지 않는 느낌을 가졌습니다. 나는 당신의 책을 읽게되어 매우 행복 할 것입니다. 도움을 많이 주셔서 감사합니다 – SLN

+1

코드 캡처를 볼 수있는 코드 수정을 추가했습니다. 나는 이것이 놀이터가 이런 종류의 것을 테스트하는 데별로 도움이되지 않는다는 당신의 다른 직관을 확인해 준다고 생각합니다. – matt

관련 문제