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

Posted

技术标签:

【中文标题】为啥我的 Xcode 编译器告诉我我使用了值类型,即使我使用了类?【英文标题】:Why does my Xcode compiler tell me I use a value type even though I use classes?为什么我的 Xcode 编译器告诉我我使用了值类型,即使我使用了类? 【发布时间】:2020-09-09 18:56:01 【问题描述】:

我有两个classes:玩家和敌人,它们都符合protocol CharacterCharacteristicsProtocol:

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

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

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...

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

【问题讨论】:

检查这个:***.com/q/31960117/1187415——你可能想将 CharacterCharacteristicsProtocol 声明为“类协议” 【参考方案1】:

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

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

【讨论】:

只是一个小的旁注:: class 被认为不太受欢迎; : AnyObject 是将协议采用限制为类类型的首选方式。 @Losiowaty 啊,好吧,我不知道。因此,即使您只使用类,您也特别需要限制协议。非常感谢您解决这个问题! @VadimBelyaev 好的,很高兴知道!您能否详细说明一下为什么使用 AnyObject 更有利。 AnyObject 不也包含结构吗? @JoakimSjöstedt,: class 在官方 Swift 文档中不再提及,因此我推测它最终可能会被弃用。 : class: AnyObject 之间存在细微差别,如下所述:***.com/questions/30176814/… 实际上,在大多数情况下,两者的行为相同。结构不能符合AnyObject(编译器会引发错误),因此结构不能符合用: AnyObject 声明的纯类协议。

以上是关于为啥我的 Xcode 编译器告诉我我使用了值类型,即使我使用了类?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Game Maker Studio 告诉我我的 if 语句不起作用?

为啥 OpenGL 告诉我我已经使用了 GL_STATIC_DRAW 而我已经指定了其他方式?

为啥编译器告诉我没有运算符与我的“if”和“else if”语句中的操作数类型匹配?

为啥 Microsoft Graph API 告诉我我刚刚创建的事件仍然存在时被“@removed”?

从命令行问题构建 XCode(更新权利文件位置)

为啥编译我的 XCode 项目可以使用 Apple-(B)uild 并且无法使用 Apple-(U)nit 测试编译?