0

我有两个classes:玩家和敌人都符合protocolCharacterCharacteristicsProtocol:

class Enemy: CharacterCharacteristicsProtocol {...
class Player: CharacterCharacteristicsProtocol {...

他们既是references又不values像是structs;仍然当我objects像这样发送 as 参数时:

viewModel.combatButtonIsClicked(attacker: self.player, defender: self.enemy) { result in...

我得到错误

将“CharacterCharacteristicsProtocol”类型的值传递给 inout 参数需要显式“&”

为什么会出现这个?这不应该只发生在structs吗?

如果我按照编译器的意愿进行操作,inout并且&在适当的位置进行操作,那么除了在现在出现错误的闭包中之外

转义闭包捕获“inout”参数“characterVM”

这是它发生的地方(只是为了完成):

func enemyTurn(enemyVM: CharacterCharacteristicsProtocol, characterVM: inout CharacterCharacteristicsProtocol, completion: @escaping(_ enemyReponse: String) -> Void){
    let xEnemy = enemyVM.getX()
    let yEnemy = enemyVM.getY()
        
    viewModel.enemyShouldMove = true

    viewModel.proximityCheck(checkProxyForWho: .enemy, i: xEnemy, j: yEnemy, completion: {
        let combat = Combat()
        combat.combat(attacker: enemyVM, defender: &characterVM, completion: { result in...

我搜索了如何解决此错误并获得以下建议:“将结构更改为类”...

4

1 回答 1

1

你的协议类绑定了吗?如果不是,编译器需要假设 astruct也可以实现它并且需要应用值语义。
要绑定协议类,您只需要这样做:
protocol CharacterCharacteristicsProtocol: class

然后您将只能使用类而不是结构来实现它,并且编译器将能够假定仅适用引用语义。

于 2020-09-09T19:07:26.873 回答