2017-09-29 11 views
0

내 SpriteKit 게임에서 내 스프라이트의 SKPhysicsBody에 대한 fieldBitMask 속성에 속성 관찰자를 추가하고 싶습니다. 내가 어떤 조치를 취할 수 있도록 fieldBitMask 속성이 변경되면 알려주고 싶습니다.iOS 라이브러리 클래스의 기존 속성에 속성 관찰자 추가

나는 SKPhysicsBody을 오버런했는데, 보통 SKPhysicsBody과 같은 스프라이트 노드에 오버라이드 된 클래스를 할당하려고 시도했을 때 많은 오류가 발생했습니다. 또한 SKPhysicsBody에 대한 확장을 생각했지만 Apple 설명서에 따르면 "Extension은 유형에 새로운 기능을 추가 할 수 있지만 기존 기능을 재정의 할 수 없습니다."따라서이 방법을 사용하여 fieldBitMask 속성을 재정의 할 수없는 것처럼 보입니다. 그것은 부동산 관찰자입니다.

내가 만든 새 사용자 지정 클래스에 속성 관찰자를 만드는 방법을 알고 있습니다. 그러나 Apple 라이브러리의 일부인 클래스의 기존 속성에 속성 관찰자를 추가하는 가장 좋은 방법은 무엇입니까?

+1

이 속성을 구독해야합니까? 나는 좋은 건축물 안에서이 속성의 가치를 바꾸면 안된다고 생각합니다. 이 속성은 피직스 객체의 유형을 결정하므로 객체의 유형을 변경해야하는 경우 SKPhysicsBody의 새 인스턴스를 만들 수 있습니다. –

+1

아니요,하지만 이것이 내 프로젝트에 편리한 접근이라고 생각했습니다. 몇 가지 물리 필드와 일부 스프라이트가 있으며, 어떤 물리 필드가 스프라이트에 영향을 미치는지 주기적으로 변경하고 싶습니다. 몇 가지 요소가 필드를 변경할 수 있으며 코드의 여러 위치에서 변경 사항에 응답하는 대신 속성 관찰자를 사용하여 'fieldBitMask'를 설정하는 것이 더 쉽다고 생각했습니다. 그런 다음 속성 관찰자에 대한'didSet'의 필드 변경에 응답하면됩니다. 이것이 작동하지 않는 것 같기 때문에 나는 긴 접근법을 취할 필요가있다. – peacetype

답변

1

당신은 그런 SKPhysicsBody를 서브 클래 싱 할 수 있습니다

class Subclass: SKPhysicsBody { 
    override var fieldBitMask: UInt32 { 
     didSet { 
      print(fieldBitMask) 
     } 
    } 
} 
+0

이것이 작동해야합니다. 적어도 Swift 4에서는 오류가 발생하지 않지만 이전 버전 이후로 가능했을 것입니다. –

+1

이것을 초기화하여 스프라이트 노드에 할당 할 수 있습니까? 일반적으로이 'spriteNode.physicsBody = SKPhysicsBody (circleOfRadius : 2)'와 같은 SKPhysicsBody를 지정할 수는 있지만 하위 클래스에는 이니셜 라이저가 없습니다. 하위 클래스에'super.init()'를 추가하려고 시도했지만 많은 오류가 발생했습니다. – peacetype

+1

아, 그렇게 생각하지 않았습니다. 모든 초기화 프로그램과 함수가 상속되지 않는 것처럼 보입니다. Andrew Romanov의 답변이 아마도 당신의 경우에 더 적합 할 것입니다! –

1

나는 당신이 Key Value Observing를 사용할 수 있다고 생각합니다. 변화하는 속성에 관찰자를 추가 할 수 있습니다.
옵서버 클래스에서 implementobserveValue(forKeyPath:of:change:context:) 메서드를 사용해야합니다.

Here 신속한 예 ('키 - 값 관측'부분)을 찾을 수 있습니다.

+1

세 번째 링크에는 관찰하려는 모든 속성에'dynamic' 한정자와'@ objc' 속성을 추가해야한다는 요구 사항이 언급되어 있습니다. " 기존 iOS 클래스를 재정의해야합니다. 따라서이 접근법은 Trevör Anne Denise의 대답과 같은 문제를 가지고 있습니다.이 문제는 클래스를 재정의하면 스프라이트 노드에 할당 할 수 없습니다. – peacetype

+0

SKPhysicsBody는 Objective-C 클래스이므로 수정하지 않고 Key Value Observing을 사용할 수 있다고 생각합니다. –

+0

Objective-C 코드에서 사용되는 Swift 클래스에 dynamic 및 @objc 속성을 추가해야합니다. –