2017-10-10 2 views
0

名前付きプロパティを更新するいくつかの既定のメソッドでプロトコルを作成しようとしています。残念ながら、私は私が示唆したように変異する方法を変更した場合は、その後、私は火メソッドの使用時にエラーが発生しますLeft side of mutating operator isn't mutable…プロトコル拡張の指定されたプロパティを更新できますか?

protocol Weapon { 
    var energy: Int { get set } 
    var fireEnergy: Int { get } 
    var rechargeRate: Int { get } 

    func fire() 
    func recharge() 
} 

extension Weapon { 
    var fireEnergy: Int { 
     return 10 
    } 

    var rechargeRate: Int { 
     return 2 
    } 

    func fire() { 
     guard energy >= fireEnergy else { return } 
     energy -= fireEnergy // <- Error Here 
    } 

    func recharge() { 
     energy += rechargeRate // <- Error Here 
    } 
} 

class PhaseCannon: Weapon { 
    var energy = 0 
} 

エラーを取得しています。 Cannot use mutating member on immutable value…

var weapons = [PhaseCannon()] 

for weapon in weapons { 
    weapon.fire() // <- Error here 
} 

できませんか?サイクルの中武器がせあるので

+0

'PhaseCannon'は、クラスまたは構造体ですか? –

+0

@Aaron BratcherはPhase-canononクラス –

+0

を '-fire()'と '-recharge()'で 'mutating'を使って共有できます。一方、あなたの反復の中では、あなたは不変のローカル型に対してmutatingメソッドを使うことはできません。 – holex

答えて

0

あなたの2番目のエラーです。最速修正はあなたがあなたのコードを変更することができます:既存のコードの許可をリファクタリングした場合

var weapons = [PhaseCannon()] 
var newWeapons: [PhaseCannon] 

for weapon in weapons { 
    var updatedWeapon = weapon 
    updatedWeapon.fire() // <- Error here 
    newWeapons.append(weapon) 
} 
+0

メソッドを変更してforループを '武器のvar weapons'として実行すると、正しく動作することがわかりました。クラスインスタンスがvarである必要があるのは単なる奇妙なことです。 –

+0

@AaronBratcher、素晴らしい、それはさらに良いです:) –

0

、私はクラスではなく構造体にPhaseCannonを回してお勧めします。

そうしないと、このようなあなたの更新のループを変更することができます:

for index in weapons.indices 
{ 
    weapons[index].fire() 
} 
関連する問題