今天,我决定在Swift中对SKSpriteNode进行子类测试,并很快意识到这并不像我的目标C背景所建议的那样简单。经过一段时间的狩猎和在操场上的一些测试,我想出了下面的内容(见下文)。我还没有在一个项目中测试这一点,因为我刚刚开始我的下一场比赛,但我想我会在这里添加这一点,看看我是否在正确的轨道上,做我已经做的正确,任何建议或意见将是最有帮助的。
我对此很满意,但我只是好奇是否有什么我没有做的,或者我正在做的事情我不应该做。
// ------------------------------------------------------------------- **
// SKSpriteNode subclass, NSCoding not implemented
// ------------------------------------------------------------------- **
class SimpleSprite: SKSpriteNode {
var simpleName: String
var simpleType: Double
init(simpleName: String, simpleType: Double) {
self.simpleName = simpleName
self.simpleType = simpleType
let spriteColor = SKColor.redColor()
let spriteSize = CGSize(width: 10.0, height: 10.0)
super.init(texture: nil, color: spriteColor, size: spriteSize)
}
required init?(coder aDecoder: NSCoder) {
// Class does not want to be NSCoding-compatible
fatalError("init(coder:) has not been implemented")
}
}
let simpleSprite = SimpleSprite(simpleName: "SimpleRabbit", simpleType: 22.1)
simpleSprite.simpleName
simpleSprite.color
// ------------------------------------------------------------------- **
// SKSpriteNode subclass, NSCoding-compatible
// ------------------------------------------------------------------- **
class CodedSprite: SKSpriteNode {
var simpleName: String
var simpleType: Double
init(simpleName: String, simpleType: Double) {
self.simpleName = simpleName
self.simpleType = simpleType
let spriteColor = SKColor.whiteColor()
let spriteSize = CGSize(width: 10.0, height: 10.0)
super.init(texture: nil, color: spriteColor, size: spriteSize)
}
required init?(coder aDecoder: NSCoder) {
self.simpleName = aDecoder.decodeObjectForKey("SIMPLE_NAME") as String
self.simpleType = aDecoder.decodeDoubleForKey("SIMPLE_TYPE")
super.init(coder: aDecoder)
}
override func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.simpleName, forKey: "SIMPLE_NAME")
aCoder.encodeDouble(self.simpleType, forKey: "SIMPLE_TYPE")
super.encodeWithCoder(aCoder)
}
}
let codedSprite = CodedSprite(simpleName: "CodedRabbit", simpleType: 22.1)
codedSprite.simpleName
codedSprite.color发布于 2014-11-25 23:26:16
我要忽略非编码类。我不知道你为什么要把这两样都包括进去。
尽管如此,下面是我注意到的关于编码类的一些事情。
与其使用init(simpleName:simpleType:),不如扩展超类的init,并接受超类init所采用的参数:
init(texture: SKTexture?, color: UIColor, size: CGSize, name: String, type: Double) {
self.simpleName = name
self.simpleType = type
super.init(texture: texture, color: color, size: size)
}然后,如果我们想要一个只接受其中一些值并使用默认值的初始化程序,那么我们应该使用方便的初始化器:
convenience init(name: String, type: Double) {
self.init(texture: nil, color: UIColor.whiteColor(), size: CGSizeMake(10.0, 10.0), name: name, type: type)
}我们可能应该推翻SKNode's的任何一个构造函数,这些构造函数我们打算保持如下:
override convenience init(texture: SKTexture?, color: UIColor, size: CGSize) {
self.init(texture: texture, color: color, size: size, name: "", type: 0.0)
}最后,重点是,我们所有的初始化逻辑都应该尽可能少地使用构造函数。我们所有的其他构造函数都应该调用这几个指定的构造函数。
https://codereview.stackexchange.com/questions/70810
复制相似问题