我可以更新协议扩展中的指定属性吗?
我正在尝试使用一些更新命名属性的默认方法创建一个协议。不幸的是如果我改变了方法变异的建议,然后我在使用了火法的角度得到一个错误,我得到一个错误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
}
我不能这样做吗?
你的第二个错误是因为武器在循环是让。最快的修复可能的是,你可以更改您的代码:
var weapons = [PhaseCannon()]
var newWeapons: [PhaseCannon]
for weapon in weapons {
var updatedWeapon = weapon
updatedWeapon.fire() // <- Error here
newWeapons.append(weapon)
}
我发现如果我改变方法来进行变异,然后对for循环做'for var weapon in weapon',它就能正常工作。只有一个类实例需要是一个var。 –
@AaronBratcher,真棒,它甚至更好:) –
如果重构现有的代码证,我建议打开PhaseCannon成一个类,而不是一个结构。
否则,你可以改变你的更新循环是这样的:
for index in weapons.indices
{
weapons[index].fire()
}
'PhaseCannon'是一个类或结构? –
@Aaron Bratcher你可以在这里使用'-fire()'和'-recharge()'关键字'mutating'来分享阶段加农炮类 –
;另一方面,在你的迭代中,你不能在不可变的本地类型上使用变异方法。 – holex