2017-07-19 60 views
2

這是我的代碼。我一直堅持這一點。我似乎無法弄清楚。我遵循的指南要求我在Fighter子類中使用super.init(),但每次嘗試時似乎都會給我一個錯誤。Swift 4 - 無法調用'Spaceship.init'

class Spaceship { 
    var name = String() 
    var health = Int() 
    var position = Int() 
    init(name: String) { 
     self.name = name 
    } 
    init(health: Int) { 
     self.health = health 
    } 
    init(position: Int) { 
     self.position = position 
    } 
    func moveLeft() { 
     position -= 1 
    } 
    func moveRight() { 
     position += 1 
    } 
    func wasHit() { 
     health -= 5 
    } 
} 

class Fighter: Spaceship { 
    let weapon: String 
    var remainingFirePower: Int 
    init(remainingFirePower: Int) { 
     self.remainingFirePower = remainingFirePower 
    } 
    init(weapon: String) { 
     self.weapon = weapon 
     super.init() //Cannot invoke 'Spaceship.init' with no arguments 
    } 
    func fire() { 
     if remainingFirePower > 0 { 
      remainingFirePower -= 1 
     } else { 
      print("You have no more fire power.") 
     } 
    } 
} 
+3

「SpaceShip」的所有初始值設定項都帶有一個參數。您必須調用其中一個初始化程序並傳遞它所需的參數,或者將初始化程序添加到不帶參數的「SpaceShip」中。 – vacawama

+0

所以,我試圖做super.init(名稱:「」)和其他2類似。它仍然沒有工作。顯然,我不允許有超過一個super.init聲明。我也嘗試逗第一個想法,但也沒有奏效。你可以給我一個例子嗎? –

+0

http://swift.sandbox.bluemix.net/#/repl/596ec586c721ee1b86ab9542 – vacawama

回答

0

你沒有,設置所有的實例變量在類的傳遞值的初始化。除非有特定的有效默認值,否則爲每個值單獨設置一個init是很奇怪的。我建議您閱讀有關designated initializers,並可能修改您的代碼以在Spaceship中使用init(name:health:position:)初始值設定項,在Fighter中使用init(name:health:position:weapon:remainingFirePower:)初始值設定項來調用超級實現並傳遞值。

如果有任何值不希望爲空字符串或零,則不應爲它們提供默認值,因此需要在初始化程序中使用它們。

這相當於您的代碼被修改爲具有指定的初始值設定項,該初始值設定項設置所有項並且具有默認值。

class Spaceship { 
    var name : String 
    var health : Int 
    var position : Int 
    init(name: String = "", health: Int = 0, position: Int = 0) { 
     self.name = name 
     self.health = health 
     self.position = position 
    } 
    func moveLeft() { 
     position -= 1 
    } 
    func moveRight() { 
     position += 1 
    } 
    func wasHit() { 
     health -= 5 
    } 
} 

class Fighter: Spaceship { 
    let weapon: String 
    var remainingFirePower: Int 
    init(name: String = "", health: Int = 0, position: Int = 0, weapon: String = "", remainingFirePower: Int = 0) { 
     self.weapon = weapon 
     self.remainingFirePower = remainingFirePower 
     super.init(name: name, health: health, position: position) 
    } 

    func fire() { 
     if remainingFirePower > 0 { 
      remainingFirePower -= 1 
     } else { 
      print("You have no more fire power.") 
     } 
    } 
} 
+0

聖潔的廢話!這非常有道理!謝謝! –

相關問題