2017-06-27 7 views
0

私は迅速です。私は迅速にApp Developmentのエクササイズをやっています。クラスのメンバーワイズ初期化子と参照。エラー:プロパティで 'self'を使用しています

この問題の解決方法はわかりません。問題は、すべてのデフォルト値を指定せずに独自のイニシャライザを作成することです。

class Spaceship { 
    let name: String 
    var health: Int = 100 
    var position: Int = 0 

    func moveLeft() { 
     position -= 1 
    } 

    func moveRight() { 
     position += 1 
    } 

    func wasHit() { 
     health -= 5 
    } 

    init(name:String, health:Int, position:Int) { 
     self.name = name 
     self.health = health 
     self.position = position 
    } 
} 

class Fighter: Spaceship { 
    let weapon: String 
    var remainingFirePower: Int 

    init(weapon:String,remainingFirePower:Int) { 
     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.") 
     } 
    } 
} 

class ShieldedShip: Fighter { 
    var shieldStrength: Int 

    override func wasHit() { 
     if shieldStrength > 0 { 
      shieldStrength -= 5 
     } else { 
      super.wasHit() 
     } 
    } 
    init(shieldStrength:Int, weapon:String, remainingFirePower:Int){ 
     self.shieldStrength = shieldStrength 
     super.init(weapon:weapon, remainingFirePower:remainingFirePower) 
    } 
} 
+0

あなたのsmをデバッグするにはひどい場所ですすべてのプログラム。 https://ericlippert.com/2014/03/05/how-to-debug-small-programs/あなた自身でこれを解決するためにどのような措置を講じましたか? – jdv

+0

名前、健康状態、位置に値を与えると、プログラムは完璧に動作します。私は、これよりもむしろプログラムを解決する他の方法があるのだろうかと思っています。問題は、すべてのデフォルト値を指定せずに独自のイニシャライザを作成することです。 – sam

+0

完全に動作する場合は、完全に動作しなくなる場所を把握する方法があります。あなたが行っている間、あなたの主張をテストして、知られている者から知られていない者まで働きなさい。 – jdv

答えて

0

optionalタイプについて読む。あなたが書くことができます:ここで

let name: String? 
var health: Int? 
var position: Int? 

Link for optional types

+0

私はこれがOPが実際に求めていたものだとは思わない。このエラーは 'super.init(name:name、health:health、position:position)'で発生します。したがって、質問は –

0

IDをあなたが望む

init(name:String = "ship", health:Int = 100, position:Int = 0) { 
    self.name = name 
    self.health = health 
    self.position = position 
} 

は基本的に、あなたは次のようにデフォルト値を設定したいとあなただけのデフォルト値で、それを初期化したい場合は、何もこの関数に渡さないでください。

super.init() 
+0

にする必要があります。少なくとも、最初にinitセクションのこのパラメータに値を与える必要がありますか?私自身の初期化子を書くことによって質問の意味を理解できません。 – sam

+0

@はい。あなたの 'Spaceship'クラスのinitメソッドのデフォルト値を使いたいのであれば、私が行ったようにそれを行う必要があります。このinitメソッドを呼び出すと、データを渡してデフォルト値をオーバーライドするか、入力を省略してデフォルト値を使用することができます –

関連する問題