2014-12-28 132 views
1

我有這個類爪牙奇怪元類型初始化錯誤

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() 
    } 
} 

如果我要實例化這個類,我可以做到這一點的元類型。

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

在我看來,你已經設法說服編譯器讓你做你不應該做的事情。

如果您刪除您從層級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和同樣的解決方案可能會有所幫助。