【问题标题】:How to Create a Value for key如何为键创建值
【发布时间】:2016-03-30 20:25:39
【问题描述】:

我试图让我的 SKNode 有一个值 forkey,我可以访问它以从中获取值。它就像名称属性(skspritenode.name),但我希望能够将布尔值作为值。

这就是我试图创造这个价值的方式。

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

然后当我尝试访问它时,我会使用它

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

我被难住了。有什么建议么? 如果这有点令人困惑,我深表歉意。我不擅长解释简单的事情。

【问题讨论】:

  • 有什么问题?

标签: swift sprite-kit setvalue


【解决方案1】:

问题是 SKNode 上不存在 is_Block。

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)")

【讨论】:

  • 我认为子类化是更好的选择。添加的varobj_xxxAssociatedObject 将像static 一样工作。意味着每个实例都将共享该值。
  • 是的,忘记那部分了,我这样做时使用了唯一标识符
  • 等等,别管@trick14,实例不共享值,因为它是通过键和对象关联的,而不仅仅是键,因此'self'作为第一个参数。我在想别的事。
  • @KnightOfDragon 你是对的。我测试了这段代码的objective-c 版本,但我发现它们有共同的价值。也许我做错了什么。
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 2014-12-30
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多