2016-06-07 4 views
0

나는 CS193 수업을 듣고 있습니다. video의 정확한 순간부터.인스턴스화 중에 속성 (저장 및 계산)에 액세스하는 방법은 무엇입니까?

옵션 1 :

class FaceView: UIView 
{ 
    var scale: CGFloat = 0.90 
    var mouthCurvature: Double = 1.0 

    private var skullRadius: CGFloat { 
     return min(bounds.size.width, bounds.size.height)/2 * scale 
    } 
} 

이유는 쓸 수 없습니다

옵션 2 : 교수는 가고 '당신이 할 수있는 초기화하는 동안 당신을 설명

class FaceView: UIView 
{ 
    var scale: CGFloat = 0.90 
    var mouthCurvature: Double = 1.0 

    private var skullRadius = min(bounds.size.width, bounds.size.height)/2 * scale 

} 

자신의 재산에 접근하지 마십시오. 따라서 옵션 2를 사용하면 다음과 같은 오류 메시지가 나타납니다 : instance member 'bounds' cannot be used on type 'FaceView'.

그래도 옵션 1의 인스턴스 멤버 인 'bounds'에 액세스 할 수 있습니까? 차이점이 뭐야? 아니면 액세스가 괜찮은가요?하지만 초기화 중에 하나의 속성을 다른 속성에 종속시키지 못하나요?

+0

의 차이입니다. 옵션 2에서면 뷰는 아직 인스턴스화되지 않았으므로 경계가 없습니다 – Jared

+0

내 질문을 전달할 수 없었던 것 같습니다. 이미 알고 있습니다 ... 옵션 1에서 인스턴스화 된 것으로 간주되는 방법은 무엇입니까? 우리는 무엇을 다르게하고 있습니까? 간단히'return'하고 이슈를 풀어도 나에게 알려지지 않는다 ... – Honey

+3

'scale'과'mouthCurvature'는'FaceView'의 인스턴스가 초기화 될 때 초기화됩니다. 계산 된 속성 인'skullRadius'는 인스턴스화 된 객체가 인스턴스화 된 후에 그 속성이 요구 될 때 계산됩니다. 'skullRadius'가 일반적인 속성 인 다른 경우에는 인스턴스화시 설정되어 있으므로 다른 멤버는 아직 사용할 수 없습니다. – ColGraff

답변

1

이것은 저장 속성과 계산 속성의 차이점 중 하나입니다.

scalemouthCurvature의 인스턴스는 인스턴스가 인스턴스화 될 때 초기화됩니다.

첫 번째 예제에서 skullRadiusFaceView 인스턴스에 인스턴스화 후 호출 된 해당 속성이있을 때 계산되는 계산 된 속성입니다.

두 번째 예제에서 skullRadius은 인스턴스화시 초기화되는 저장된 속성입니다. 다른 속성은 아직 초기화되지 않았거나 초기화되지 않았기 때문에 아직 사용할 수 없습니다. 여기

는 초기화하는 동안 다른 속성을 참조하는 방법은 다음과 같습니다 게으른 속성을 수정할 수있는 방법을 보여

class test { 
    let foo = 1 // stored property 
    let bar = 2 // stored property 
    let buzz: Int // stored property not initialized when other stored properties are initialized 
    init() { 
    buzz = foo + bar // initialized after other stored properties 
    } 
} 

예 : 당신이 그것을 액세스 할 때

class Test { 
    lazy var foo: Int = { return 5 }() 
} 

let test = Test() 
print(test.foo) -> "5" 
test.foo = 10 
print(test.foo) -> "10" 
+0

그래서 ** ** 1 ** ** 모든 계산 된 속성은 ** 인스턴스화 후 ** 발생합니다. ** 2) ** bounds는 저장된 프로퍼티이고'skullRadius'는 계산 된 프로퍼티입니다 ** 3) ** 인스턴스화 중에'SomeStoredProperty = someCalculationOfAnotherStoredProperty' *를 할 수 없습니까? ** 4) ** 그러므로 SomeStoredProperty (return someCalculationOfAnotherStoredProperty)를해야합니다. – Honey

+1

'lazy var someStoredProperty : T = {... return x}()'를 사용하여 주위를 둘러 볼 수 있습니다. – jtbandes

+1

예, 꽤 많이 있습니다. 또한 저장된 속성을 사용할 수 있으며 init 메서드에서 다른 속성을 설정하면 저장된 속성을 참조 할 수 있습니다. init 메소드는 저장된 특성이 초기화 된 후에 발생합니다. 나는 이것을 보여줄 나의 대답을 업데이트했다. – ColGraff