2017-10-10 110 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你可以在这里使用'-fire()'和'-recharge()'关键字'mutating'来分享阶段加农炮类 –

+0

;另一方面,在你的迭代中,你不能在不可变的本地类型上使用变异方法。 – holex

回答

0

你的第二个错误是因为武器在循环是。最快的修复可能的是,你可以更改您的代码:

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

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

我发现如果我改变方法来进行变异,然后对for循环做'for var weapon in weapon',它就能正常工作。只有一个类实例需要是一个var。 –

+0

@AaronBratcher,真棒,它甚至更好:) –

0

如果重构现有的代码证,我建议打开PhaseCannon成一个类,而不是一个结构。

否则,你可以改变你的更新循环是这样的:

for index in weapons.indices 
{ 
    weapons[index].fire() 
}