Swift SKEmitterNode的子类不调用init或deist
我可以初始化这个类,并看到我的粒子效果,但子类不调用init()或deinit。为什么?Swift SKEmitterNode的子类不调用init或deist,swift,sprite-kit,Swift,Sprite Kit,我可以初始化这个类,并看到我的粒子效果,但子类不调用init()或deinit。为什么? class Particles: SKEmitterNode { var test: Int? override init() { test = 1 super.init() println("created particle emitter") } required init?(coder aDecoder: NSCod
class Particles: SKEmitterNode {
var test: Int?
override init() {
test = 1
super.init()
println("created particle emitter")
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
println("destroyed particle emitter")
}
}
这是从GameSecene()调用的
让粒子=粒子(文件名为:“测试”)
我试着这样做:
粒子:粒子
viewDidLoad:
particle=Particles(fileNamed:“test”)子类只能调用超类指定的初始化器,因此不能调用
super.init(fileNamed:)
。一种解决方法是根本不生成初始化器,而是生成一个类方法并在其中执行设置代码。
我复制了apple提供的用于取消sks场景归档的代码,并将其更改为与发射器一起使用。该方法查找粒子文件(如果存在),并将其作为粒子对象取消归档:
class Particles: SKEmitterNode {
var test: Int?
class func fromFile(file : String) -> Particles? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var data = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: data)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKEmitterNode")
let p = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as Particles
archiver.finishDecoding()
//Perform any setup here
p.test=11
return p
}
return nil
}
}
并像这样使用它:
let p=Particles.fromFile("MyParticle")!
p.test=0
p.particleSpeed=10
addChild(p)
子类只能调用超类指定的初始化器,因此不能调用
super.init(filename:)
。一种解决方法是根本不生成初始化器,而是生成一个类方法并在其中执行设置代码。
我复制了apple提供的用于取消sks场景归档的代码,并将其更改为与发射器一起使用。该方法查找粒子文件(如果存在),并将其作为粒子对象取消归档:
class Particles: SKEmitterNode {
var test: Int?
class func fromFile(file : String) -> Particles? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var data = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: data)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKEmitterNode")
let p = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as Particles
archiver.finishDecoding()
//Perform any setup here
p.test=11
return p
}
return nil
}
}
并像这样使用它:
let p=Particles.fromFile("MyParticle")!
p.test=0
p.particleSpeed=10
addChild(p)
子类只能调用超类指定的初始化器,因此不能调用
super.init(filename:)
。一种解决方法是根本不生成初始化器,而是生成一个类方法并在其中执行设置代码。
我复制了apple提供的用于取消sks场景归档的代码,并将其更改为与发射器一起使用。该方法查找粒子文件(如果存在),并将其作为粒子对象取消归档:
class Particles: SKEmitterNode {
var test: Int?
class func fromFile(file : String) -> Particles? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var data = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: data)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKEmitterNode")
let p = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as Particles
archiver.finishDecoding()
//Perform any setup here
p.test=11
return p
}
return nil
}
}
并像这样使用它:
let p=Particles.fromFile("MyParticle")!
p.test=0
p.particleSpeed=10
addChild(p)
子类只能调用超类指定的初始化器,因此不能调用
super.init(filename:)
。一种解决方法是根本不生成初始化器,而是生成一个类方法并在其中执行设置代码。
我复制了apple提供的用于取消sks场景归档的代码,并将其更改为与发射器一起使用。该方法查找粒子文件(如果存在),并将其作为粒子对象取消归档:
class Particles: SKEmitterNode {
var test: Int?
class func fromFile(file : String) -> Particles? {
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") {
var data = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: data)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKEmitterNode")
let p = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as Particles
archiver.finishDecoding()
//Perform any setup here
p.test=11
return p
}
return nil
}
}
并像这样使用它:
let p=Particles.fromFile("MyParticle")!
p.test=0
p.particleSpeed=10
addChild(p)
您是如何创建您的
Particles
实例的?我尝试了多种方法:var particle=Particles(文件名:“test”)、let particle=Particles(文件名:“test”)、var particle:Particles?谢谢你的帮助。很抱歉,当我开始我的句子时,我按了回车键。再次感谢,我真的很感激。我个人开始觉得斯威夫特还没有准备好迎接黄金时间。它似乎一路和你搏斗。是的,是的。对于我发现的fileNamed
应该是一个方便的初始值设定项,因此应该调用init
。。。我已经开始用C/Objective-C编写我的部分应用程序了,因为这样的事情……你是如何创建你的Particles
实例的?我尝试了多种方法:var particle=Particles(filename:“test”)、let particle=Particles(filename:“test”)、var particle:Particles?谢谢你的帮助。很抱歉,当我开始我的句子时,我按了回车键。再次感谢,我真的很感激。我个人开始觉得斯威夫特还没有准备好迎接黄金时间。它似乎一路和你搏斗。是的,是的。对于我发现的fileNamed
应该是一个方便的初始值设定项,因此应该调用init
。。。我已经开始用C/Objective-C编写我的部分应用程序了,因为这样的事情……你是如何创建你的Particles
实例的?我尝试了多种方法:var particle=Particles(filename:“test”)、let particle=Particles(filename:“test”)、var particle:Particles?谢谢你的帮助。很抱歉,当我开始我的句子时,我按了回车键。再次感谢,我真的很感激。我个人开始觉得斯威夫特还没有准备好迎接黄金时间。它似乎一路和你搏斗。是的,是的。对于我发现的fileNamed
应该是一个方便的初始值设定项,因此应该调用init
。。。我已经开始用C/Objective-C编写我的部分应用程序了,因为这样的事情……你是如何创建你的Particles
实例的?我尝试了多种方法:var particle=Particles(filename:“test”)、let particle=Particles(filename:“test”)、var particle:Particles?谢谢你的帮助。很抱歉,当我开始我的句子时,我按了回车键。再次感谢,我真的很感激。我个人开始觉得斯威夫特还没有准备好迎接黄金时间。它似乎一路和你搏斗。是的,是的。对于我发现的fileNamed
应该是一个方便的初始值设定项,因此应该调用init
。。。我已经开始用C/Objective-C编写我的部分应用程序,因为这样的事情……首先,p.test=0或p.test!=0导致崩溃。第二,我真的很想理解这种语言。init(filename:name)是一个初始值设定项,所以它必须调用它的init,对吗?那么为什么它不调用Particles.init()?另外,我不知道是否正在调用deinit,或者我只是在某个地方发生了泄漏。这将返回一个Particles对象,而我的另一个代码则返回一个SKEmitterNode对象。抱歉,我甚至没有测试我的其他代码。但是为什么我们不能使用fileNamed?首先,p.test=0或p.test!=0导致崩溃。第二,我真的很想理解这种语言。init(filename:name)是一个初始值设定项,所以它必须调用它的init,对吗?那么为什么它不调用Particles.init()?另外,我不知道是否正在调用deinit,或者我只是在某个地方发生了泄漏。这将返回一个Particles对象,而我的另一个代码则返回一个SKEmitterNode对象。抱歉,我甚至没有测试我的其他代码。但是为什么我们不能使用fileNamed?首先,p.test=0或p.test!=0导致崩溃。第二,我真的很想理解这种语言。init(filename:name)是一个初始值设定项,所以它必须调用它的init,对吗?那么为什么它不调用Particles.init()?另外,我不知道是否调用了Denit,或者我只是在某个地方发生了泄漏。