我有这个类Minion
class GameObject : SKShapeNode {
var health : Int!
}
class Character : GameObject {
var cost : Int!
var movementSpeed : Int!
var damage : Int!
var specials : [Special] = []
required override init() {
super.init()
}
}
class Minion : Character {
required init() {
super.init()
self.cost = 2
self.movementSpeed = 21
self.damage = 2
self.path = SKShapeNode(rectOfSize: CGSizeMake(50, 50)).path
self.fillColor = UIColor.redColor()
}
}
如果我想实例化这个类的MetaType,我可以这样做。
let a = Minion.self()
没有错误或崩溃。
然而......如果我尝试这样做。
let b = Minion.self
let ax = b() << NO ERROR BUT CRASHES
我收到BAD_ACCESS_CODE崩溃。 这也崩溃了。
let b : Minion.Type = Minion.self
let ax = b()
有人有什么想法吗?
答案 0 :(得分:1)
在我看来,你已经设法说服编译器让你做一些你不应该做的事情。
如果您从层次结构中删除了GameObject
类型,并且只有Character
继承自SKShapeNode
,那么您的init
会出现编译错误:
error: 'required' initializer 'init(coder:)' must be provided by subclass of 'SKShapeNode'
}
^
SpriteKit.SKShapeNode:109:34: note: 'required' initializer is declared in superclass here
@objc(initWithCoder:) required init?(coder aDecoder: NSCoder)
然而,不知何故,通过将GameObject
插入到没有用户定义的init
方法的中间,它可以让你在编译时逃脱它 - 但不是在运行时。
看起来您的问题与此here类似,但不一定相同,同样的解决方案可能有所帮助。