2014-12-22 10 views
2

알 수없는 유형 (CGPoint, CGRect 등)의 인스턴스를 "박스 화"할 수있는 NSValue 객체가 있으며 런타임에이 유형을 결정해야합니다. 스위프트에서 어떻게 할 수 있습니까?NSValue에서 Swift를 사용하여 상자에 넣은 객체 유형을 아는 방법은 무엇입니까?

if ((value as Any) is CGPoint) {} 
else if (((value as Any) is CGRect)) {} 
... 

value가 CGPoint를 포함하는 NSValue 객체는, 그것이 만약 절에하지 않습니다

는이 같은 뭔가를 시도했다. 그런 다음 내가 value을 인쇄했을 때 나는 그것이 결코 절에 들어 가지 않는 이유라고 생각하는 NSPoint: {150, 150}을 준다.

왜 이런 일이 발생하고 해결하는 방법에 대한 아이디어가 있습니까?

고맙습니다.

+0

NS *와 CG * 사이에는 수신자 부담 브리징이 있습니다. if 절에서 CGPoint 대신 NSPoint를 사용하려고 했습니까? 예 : '값이 NSPoint {' –

+0

인데 컴파일러가 그 비교를 받아들이지 않고 '선언되지 않은 유형의 NSPoint 사용'이 표시됩니다. –

답변

2

아, NSValue, 정말 미쳤군. NSRect 등은 iOS에 관한 것이 아니지만 NSValue 안에 CGRect을 넣으면 내부에 NSRect이라는 내용이 표시됩니다. 어쨌든

, 그들은 유사한 용도로 사용하는 동안 당신이 또는 CGPoint 또는 CGRect에서 NSValue을 변환 Any를 사용할 수 있다고 생각하지 않습니다. value.CGRectValue() 등으로 전화해야합니다. 그러나 요점은 알 수 있습니다. 또한 어느 것이 쉬운 일이 아닙니다,하지만 당신이 할 수 있습니다 :

let type = String.fromCString(val.objCType) ?? "" 
if type.hasPrefix("{CGRect") { 
    let rect = val.CGRectValue() 
} 
else if type.hasPrefix("{CGPoint") { 
    let point = val.CGPointValue() 
} //etc... 

을하지만 또 다른 질문이 될 것이다, 당신이 정말로 NSValue를 사용해야합니까? 그것은 일종의 Obj-C 특정 해결 방법입니다. 당신이 바꿀 수 없거나 대신 Any (또는 더 나은 제너릭)을 사용하는 편이 나을 수도 있습니까?

+0

좋은 지적이지만 CAKeyFrameAnimation의 동작을 시뮬레이트하고 싶습니다. [AnyObject] 유형의 'values'속성을가집니다! 그러나 어쨌든 귀하의 솔루션에 감사드립니다. 그게 효과가있다. –

1

iOS는 NSPoint를 사용하지 않으므로 손실 될 수 있습니다. 이런 식의 내 가장 좋은 추측은 objCType을 사용하는 것으로 되돌아가는 것이고, objCType은 objective-C에서 어떻게 처리 될 것인가입니다. 안타깝게도 swift에서 @encode에 액세스 할 수 없기 때문에 가능한 코드를 하드 코딩해야합니다.

switch String(CString: value.objCType, encoding: NSUTF8StringEncoding) { 
case "{CGPoint=dd}": // handle CGPoint here 
case "{CGRect={CGPoint=dd}{CGSize=dd}}": // handle CGRect here 
}