2017-05-19 10 views
-1

isFlipped이되는 UIImageView의 기본 속성을 갖고 싶습니다. UIImageView을 하위 클래스 화하고 하나의 속성 isFlipped을 추가하여이 작업을 수행 할 수 있습니다. 하지만 이것에 대한 사용자 프로토콜과 확장 기능을 원하지만 언젠가 후에 충돌이 발생합니다. 아래는 제 코드입니다. 올바른 방법으로 어떻게 사용할 수 있습니까? 감사합니다Swift에서 프로토콜 확장 3

import Foundation 
import UIKit 

protocol FlipImage { 
    var isFlipped: Bool { get set } 
} 

extension UIImageView:FlipImage{ 
    var isFlipped: Bool { 
     get { 
      return self.isFlipped 
     } 
     set { 
      self.isFlipped = newValue 
     } 
    } 
} 
+0

"언젠가는 충돌이 발생합니까?"라는 오류 메시지가 무엇인가요? – paper1111

+0

setter가 계속해서 전화를 걸었고 충돌했습니다. –

+0

속성 getter 및 setter 자체를 반복적으로 호출합니다 (예 : http://stackoverflow.com/questions/25348049/override-a-setter-in-swift). - 연결된 객체를 사용하지 않는 한 클래스 확장에 저장된 속성을 추가 할 수 없습니다. –

답변

2

마틴 R은 클래스 확장을 통해 클래스에 저장된 속성을 추가 할 수 없다고 말했습니다. 하지만 객관적인 C 관련 개체를 사용하여 확장명을 통해 수행 할 수 있습니다.

private var key: Void? 

extension UIImageView { 
    public var isFlipped: Bool? { 
     get { 
      return objc_getAssociatedObject(self, &key) as? Bool 
     } 

     set { 
      objc_setAssociatedObject(self, 
            &key, newValue, 
            .OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
     } 
    } 
} 
+0

감사합니다 !! 그것은 작동하지만 나는 내 코드를 사용하여 계산 된 속성을 사용하여 어떻게 할 수 있는지 알고 싶습니다. 가능한 경우 알려주십시오. –

+0

계산 된 속성과 저장되지 않은 속성을 원한다면 객관적인 C 코드가 필요하지 않습니다. get {} 블록을 변경하여 자신의 코드를 실행할 수 있습니다. 계산 된 경우 set {} 블록을 제거하려고합니다. 당신이하려고하는 것을 확실하게하지 않아서 제 응답이 상당히 일반적입니다. – Spads