【发布时间】:2016-05-27 14:39:18
【问题描述】:
我有一个协议及其扩展,以及一个符合该协议的类。
protocol WarAbilities {
var strength: Int { get set }
func attack(inout opponent: WarAbilities)
}
extension WarAbilities {
func attack(inout opponent: WarAbilities) {
opponent.strength -= 1
}
}
class Warrior: WarAbilities {
var strength: Int
init(strength: Int) {
self.strength = strength
}
}
现在如果我想让两个战士战斗:
let thug1 = Warrior(strength: 10)
let thug2 = Warrior(strength: 30)
thug1.attack(&thug2)
我收到此错误消息:
错误:不能将“WarAbilities”类型的不可变值作为 inout 参数传递
添加mutating 看起来很有希望:
protocol WarAbilities {
var strength: Int { get set }
mutating func attack(inout opponent: WarAbilities)
}
extension WarAbilities {
mutating func attack(inout opponent: WarAbilities) {
opponent.strength -= 1
}
}
但编译器也不满意,我无法理解新错误消息的含义:
错误:不能将不可变值作为 inout 参数传递:从“Warrior”到“WarAbilities”的隐式转换需要临时
由于Warrior 符合WarAbilities,我认为其中一个可以工作 - 但看起来 Swift 没有这种......协方差?我什至不确定我在说什么。
我的错误是什么?
【问题讨论】:
标签: swift