奇怪的MetaType初始化错误

时间:2014-12-28 21:30:24

标签: ios objective-c iphone swift

我有这个类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()

有人有什么想法吗?

1 个答案:

答案 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类似,但不一定相同,同样的解决方案可能有所帮助。