2014-11-20 2 views
0

의 우리가이 같은 객체를 정의한다고 가정 해 봅시다 :이 예를 들어Swift에서 setValueForKey를 사용하여 객체의 textAlignment 속성을 설정하는 방법은 무엇입니까?

let object: AnyObject = { 

    var result = UILabel(frame: CGRect(x: 0, y: 0, width: 150, height: 50)) 
    result.text = "First Text" 
    result.backgroundColor = UIColor.blueColor() 

    return result 
}() 

, 내가 명시 적으로 UILabel을 만들어,하지만 내 실제 프로젝트에서 내가 만든 어떤 객체의 방식을 모르는, 그래서 난 그냥 해요 이 예에 대해 결과를 AnyObject으로 처리하십시오. 객체는 파란색 배경에 "First Text"텍스트가있는 표준 UILabel이며 기본값은 왼쪽에 맞춰져 있습니다. 이 예제의 경우

는,이 객체가 실제로 UILabel 것을 알고, 그래서 내가이 같은 특성을이다 변경할 수 있습니다 알고

(object as UILabel).text = "Second Text" 

을 그리고 지금은 텍스트를 변경했습니다. 그러나 내 실제 프로젝트에서 내 개체가 UILabel이라는 것을 알지 못하므로 (object as UILabel) 트릭을 수행 할 수 없습니다. 왜냐하면 항상 UILabel이 아니기 때문입니다. 내 주위에 setValueForKey을 사용하고 있습니다. 내 개체 (이 예에서는 도시하지 않음) respondsToSelector를 사용하여 "텍스트"라는 멤버가 있음을 확인한 후, 나는 텍스트 이런 식으로 변경할 수 있습니다 : 이제

object.setValue("Third Text", forKey: "text") 

을 나는 개체의 textAlignment을 변경하고자한다면,

object.setValue(NSTextAlignment.Center, forKey: "textAlignment") 

수행이 비록 오류가 발생합니다 :

Type 'NSTextAlignment' does not conform to protocol 'AnyObject' 
객체가 실제로 회원이 textAlignment라는이 않음을 확인한 후, 나는 같은 것을 할 싶어

CGRect 유형을 좋아하지 않았기 때문에 frame을 설정하여이 접근 방식을 시도하는 동안 비슷한 점이 있었지만 CGRectNSValue으로 변환하여 해결할 수있었습니다. 그러나 NSTextAlignment과 같은 enum 유형의 문제를 해결할 수있는 방법을 찾을 수 없습니다.

아무도 내 목표를 달성 할 수있는 방법을 알고 있습니까?

답변

4

당신은 원시 값 NSTextAlignment.Center.rawValue를 사용할 필요가

object.setValue(NSTextAlignment.Center.rawValue, forKey: "textAlignment") 
+0

이것은 완벽합니다! 나는 rawValue를 조금 보았지만, 나는 이것을 사용할 수 있다는 것을 깨닫지 못했다. 나는 그것을 사용하여'NSTextAlignment'를 호출하려했지만, 바로 enum을 setValueForKey에 넘기는 위치로 떨어지고있었습니다. 이것은 완벽하게 작동했습니다. –

0

또 다른 옵션은 채택 작업 할 유형을 관심있는 특성을 가진 프로토콜을 선언하고 확장하는 것 그 프로토콜. 이 경우에 당신에게 도움이된다면 더 안전 해 보입니다.

+0

프로토콜 접근법이 더 안전 해 보이지만 사실은 어떤 객체가 사용되는지 알지 못하기 때문에 어떤 속성을 사용할 지 모릅니다. 런타임에 모든 것이 동적으로 일어나므로 속성 자체에 대한 정적 감기는 실제로 구현할 수 없습니다. 가장 멀리 갈 수있는 것은 동적 값 (문자열 리터럴)에서 설정하려고하는 속성의 유형에 상관없이 변환 함수를 구현하는 것입니다. –

관련 문제