2017-07-19 56 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

圣洁的废话!这非常有道理!谢谢! –