为什么我的 Xcode 编译器告诉我我使用了值类型,即使我使用 类?

Why does my Xcode compiler tell me I use a value type even though I use classes?

我有两个 classes: Player 和 Enemy 都符合 protocol CharacterCharacteristicsProtocol:

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

他们都是 references 而不是像 structs 那样的 values;仍然当我将 objects 作为这样的参数发送时:

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

我收到错误

Passing value of type 'CharacterCharacteristicsProtocol' to an inout parameter requires explicit '&'

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

如果我按照编译器的意愿去做,并在适当的地方插入 inout&,除了在闭包中,现在错误是

Escaping closure captures 'inout' parameter '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...

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

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

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