为什么我的 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 而不是结构来实现它,并且编译器将能够假定仅引用语义适用。
我有两个 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 而不是结构来实现它,并且编译器将能够假定仅引用语义适用。