为啥我的 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”语句中的操作数类型匹配?