2016-10-05 2 views
1

didSet의 코드를 속성 값을 변경하지 않고 실행해야합니다.속성 값을 변경하지 않고 didSet을 호출하는 방법

최근 Objective-C에서 제공되는 setMyProperty()은없는 것 같습니다.

그래서 시도 : 오류 Assigning a property to itself 결과

self.myProperty = self.myProperty 

합니다.

myPropertyCGFloat을 될 일이 있기 때문에, 내가 할 수있는 : didSet를 트리거 않고 값에 영향을주지 않지만, 내가 여기서 뭘 뜻인지 표시되지 않습니다

self.myProperty += 0.0 

.

didSet을 더 명확하고 직접적인 방법으로 호출 할 수있는 방법이 있습니까?

+2

는 속성이 설정되어있는 것을 의미한다 값을 변경하지 않고 didSet을 실행하려고하면 의미가 없으므로 코드가 불분명 해집니다. –

답변

1

당신은 할 수 :

여기 myFunc
struct MyStruct { 
    var myProperty: CGFloat { 
     didSet { 
      myFunc() 
     } 
    } 

    func myFunc() { ... } 
} 

myProperty가 설정 될 때 호출됩니다. didSet을 호출해야하는 상황과 같이 myFunc에 직접 전화 할 수도 있습니다.

+0

나는 이것에 대해 생각했지만 계속해서 '네이티브'스위프트 구조를 찾고있었습니다. 내'didSet'은 단지 두 줄이므로 그냥 그 함수를 추가하고 싶지는 않았습니다. –

0

않았다 집합는 속성 값이 이미 변경된 후에 호출됩니다. 이전 값으로 되돌리려면 (속성의 값을 변경하지 않는 것과 같은 효과가 있으므로) 'oldValue'속성을 지정해야합니다. oldValue은 사용자가 정의한 변수가 아니므로 미리 정의되어 있습니다.

var myProperty: CGFloat { 
    didSet { 
     myProperty = oldValue 
    } 
} 
+0

대부분의 경우 변경을 원하지만 때로는 변경없이 실행하려면 didSet 만 필요합니다. –

0

당신은 3

var myProperty : (CGFloat,Bool) = (0.0, false){ 

      didSet { 
       if myProperty.1 { 

       myProperty = (0.0, false) // or (oldValue.0, false) 

        //code..... 
       }else{ 

        // code..... 
       } 
      } 


     } 

    myProperty = (1.0, true) 

    print(myProperty.0) //print 0.0 

    myProperty = (1.0, false) 

    print(myProperty.0) //print 1.0 

    myProperty = (11.0, true) 

    print(myProperty.0) //print 0.0 
+0

기술적으로 흥미 롭습니다. 이 속성을 사용하는 모든 코드를 변경해야합니다. 좋은 일이 아니야. 노력과 아이디어에 대한 감사로서 다른 답변 2 개 (20 점 부여)를 드리겠습니다. –

4

이 시도 스위프트 튜플을 사용할 수 있습니다 : 내 의견은 표시 이름으로`didSet`에서

self.myProperty = { self.myProperty }() 
+2

정답으로 받아 들여야합니다! – emiraslan

관련 문제