IT TIP

계산 된 속성과 클로저로 설정된 속성의 차이점

itqueen 2020. 12. 15. 20:40
반응형

계산 된 속성과 클로저로 설정된 속성의 차이점


저는 Swift를 처음 사용합니다. 계산 된 속성과 클로저로 설정된 속성의 차이점은 무엇입니까? 계산 된 속성이 매번 다시 계산된다는 것을 알고 있습니다. 폐쇄는 다른가요?

폐쇄:

var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

계산 됨 :

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

첫 번째는 클로저를 통해 초기화되는 저장된 속성입니다. 두 번째는 계산 된 속성입니다.

저장된 숙박 시설의 초기 폐쇄 한 번만 호출되지만 나중에 저장된 속성 값을 (당신은 대체하지 않는 한 변경할 수 있습니다 var와 함께 let). 이것은 코드를 캡슐화하여 하나의 간결한 코드 블록으로 저장된 속성을 초기화하려는 경우에 유용합니다.

그러나 계산 된 속성의 블록은 변수를 참조 할 때마다 호출됩니다. 계산 된 속성을 참조 할 때마다 코드를 호출하려는 경우에 유용합니다. 일반적으로 저장된 속성을 참조 할 때마다 계산 된 속성을 다시 계산해야 할 때이 작업을 수행합니다 (예 : 저장된 다른 개인용 속성에서 다시 계산 됨).

이 경우 의심 할 여지없이 계산 된 속성 (두 번째 예제)이 아닌 저장된 속성 (첫 번째 예제)이 필요합니다. 아마도 변수를 참조 할 때마다 새로운 푸시 동작 객체를 원하지 않을 것입니다.


그건 그렇고, 첫 번째 예에서 내부적으로 느리게 인스턴스화되는 것을 참조합니다. 이러한 동작을 원하면 다음 lazy키워드 를 사용해야합니다 .

lazy var pushBehavior: UIPushBehavior = {
    let lazilyCreatedPush = UIPushBehavior()
    lazilyCreatedPush.setAngle(50, magnitude: 50)
    return lazilyCreatedPush
}()

그러나 속성이 static인 경우 자동으로 느리게 인스턴스화됩니다.


가장 큰 차이점은 setter가 없기 때문에 계산 된 속성에 무언가를 할당 할 수 없다는 것입니다. 이 경우 클로저는 한 번만 호출되고 반환 값은 변수에 저장되므로 시간이 지남에 따라 결과가 변경되지 않으면 계산 된 변수보다 저장된 변수를 사용하는 것이 더 효율적입니다.

일반적으로 계산 된 속성은 값을 빠르게 검색 할 수있는 경우에만 사용해야합니다.

참고 : 저장된 변수를 변경 / 재할 당하지 않는 경우 상수로 만드는 것을 고려해야합니다 ( let).


폐쇄 :

  //closure
    var pushBehavior: UIPushBehavior = {
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }()

pushBehavior 변수가 처음 호출되면 블록이 실행되고 값은 pushBehavior 변수에 저장됩니다. 그 후 pushBehavior를 호출 할 때마다 해당 값이 반환됩니다.

이 변수에 처음 실행되고 저장되는 블록 코드 만 의미합니다. 또한 원할 때마다 변수 값을 저장할 수 있지만 그 이후에는 해당 값이 반환되지만 "let"으로 선언하면이 값을 변경할 수 없습니다.

계산 된 속성 :

var pushBehavior: UIPushBehavior {
    get{
        let lazilyCreatedPush = UIPushBehavior()
        lazilyCreatedPush.setAngle(50, magnitude: 50)
        return lazilyCreatedPush
    }
}

계산 된 속성에서 pushBehavior 변수를 호출 할 때마다이 블록이 실행되고 값이 반환됩니다. 그래서 매번 블록이 실행됩니다. 그리고 pushBehavior 변수에 대한 "let"키워드로 변수를 선언 할 수 없습니다.

따라서 요구 사항에 따라이 코드를 사용할 수 있습니다.


이것은 대답이 아니지만 다음과 같은 경우에 대해 언급 할 가치가 있습니다.

  • 초기화 값을 알아야하는 저장된 속성 입니다. 이는 기본값으로 또는 초기화를 통해 발생합니다.
  • 계산 된 속성의 값은 액세스 될 때까지 계산되지 않습니다.
  • A lazy loaded property's value isn't defined until it's accessed

hence for both computed and lazy variables you can access self or stored properties with no worries.

ReferenceURL : https://stackoverflow.com/questions/31515805/difference-between-computed-property-and-property-set-with-closure

반응형