2016-03-30 7 views
0

私のSKNodeに、値を取得するためにアクセスできるキーの値があるようにしようとしています。その名前プロパティ(skspritenode.name)のようなものですが、私はブール値を持つことができるようにしたいと考えています。キーの値を作成する方法

これは私がこの値を作成しようとしている方法です。私はそれにアクセスしようとすると、

block.setValue(false, forUndefinedKey: "is-Block") 

は、それから私は、私は困惑この

if block.valueForKey("is_Block") == true { 
    //run code here 
} 

を使用しています。助言がありますか? これはちょっと混乱している場合はお詫び申し上げます。私は簡単なことを説明することができません。

+0

いただきまし通報しますか? –

答えて

1

問題は、is_BlockがSKNodeに存在しないことです。

setValue forUndefinedKeyは、デフォルトでNSUndefinedKeyExceptionを発生させます。

サブクラスがある場合は、この機能をオーバーライドして、実行したいことを行います。

キー値のコーディングをよりよく理解するためにhttps://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/BasicPrinciples.htmlを参照してください。

SKNodeにis_Blockというカスタム変数が必要な場合は、SKNodeの拡張機能を作成し、このデータを格納するプロパティを作成する必要があります。

import Foundation 
import SpriteKit 
import ObjectiveC 

extension SKNode{ 
    var isBlock: Bool { 
     get { 
      var key = "isBlock"; 

      guard let block = objc_getAssociatedObject(self, &key) as? Bool 
      else{ 
       print("Error"); 
       return false 
      } 
      print("Success"); 
      return block 
     } 
     set(newValue) { 
      var key = "isBlock"; 
      print("Setting \(newValue)") 
      objc_setAssociatedObject(self, &key, newValue , objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 

} 

遊び場でのテスト:

import Foundation 
import SpriteKit 
import ObjectiveC 

extension SKNode{ 
    var isBlock: Bool { 
     get { 
      var key = "isBlock"; 

      guard let block = objc_getAssociatedObject(self, &key) as? Bool 
      else{ 
       print("Error"); 
       return false 
      } 
      print("Success"); 
      return block 
     } 
     set(newValue) { 
      var key = "isBlock"; 
      print("Setting \(newValue)") 
      objc_setAssociatedObject(self, &key, newValue , objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) 
     } 
    } 

} 


let a = SKNode() 
let b = SKNode() 

a.isBlock = false 
b.isBlock = true 
print ("\(a.isBlock), \(b.isBlock)")  

b.isBlock = false 
a.isBlock = true 
print ("\(b.isBlock), \(a.isBlock)") 
+0

私はサブクラス化が良い選択だと思います。 'obj_xxxAssociatedObject'によって追加された' var'は 'static'のように動作します。すべてのインスタンスがその値を共有することを意味します。 – Ryan

+0

はい、この部分を忘れてしまいました。私はこのようにする際にユニークな識別子を使用します。 – Knight0fDragon

+0

待ち、@ trick14は気にしないでください。インスタンスはキーとオブジェクトだけでなく、最初のパラメータとして 'self'。私は別のことを考えていた。 – Knight0fDragon

関連する問題