2016-03-30 107 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,實例不共享值,因爲它是通過鍵和對象關聯的,而不僅僅是鍵,因此'自我'作爲第一個參數。我正在想別的東西。 – Knight0fDragon

相關問題