【问题标题】:Strange MetaType Initialization Error奇怪的元类型初始化错误
【发布时间】:2014-12-28 21:30:23
【问题描述】:

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

有人有什么想法吗?

【问题讨论】:

    标签: ios objective-c iphone swift


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

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 1970-01-01
      • 2013-11-17
      • 2014-12-03
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多