出现错误:二元运算符“==”不能应用于两个“x”操作数,如何删除此对象数组中的某些元素

Posted

技术标签:

【中文标题】出现错误:二元运算符“==”不能应用于两个“x”操作数,如何删除此对象数组中的某些元素【英文标题】:getting error: Binary operator '==' cannot be applied to two 'x' operands, how to remove certain number of elements in this array of objects 【发布时间】:2021-12-21 23:49:05 【问题描述】:

我正在尝试删除阵列“甲板”中的 3 个黄色对象。该数组由 Cards 对象组成。我用过:

var counter = 3
var newArr = arr.filter 
    if counter > 0, $0 == yellow 
        counter -= 1
        return false
    
    return true

我得到错误:二元运算符“==”不能应用于两个卡操作数

我有一个结构:

import UIKit

struct Cards 
    var type: String
    var income: Int
    var images: [UIImage]
    
    init(type: String, income: Int, images: [UIImage]) 
        self.type = type
        self.income = income
        self.images = images
    


let yellow = Cards(type: "yellow", income: 0, images: [#imageLiteral(resourceName: "yellow1"), #imageLiteral(resourceName: "yellow2")])
let darkBlue = Cards(type: "dark blue", income: 2, images: [#imageLiteral(resourceName: "dark1"), #imageLiteral(resourceName: "dark2")])
let red = Cards(type: "red", income: 2, images: [#imageLiteral(resourceName: "red1"), #imageLiteral(resourceName: "red2")])
let green = Cards(type: "green", income: 1, images: [#imageLiteral(resourceName: "green1"), #imageLiteral(resourceName: "green2")])
let blue = Cards(type: "blue", income: 3, images: [#imageLiteral(resourceName: "blue1"), #imageLiteral(resourceName: "blue2")])

我有一个数组 deck = [Cards],我创建了它,然后填充了我创建的生成器,它使七张牌中的前 5 张变成黄色。当我在控制台中打印卡片组时,它显示为:

[game.Cards(type: "yellow", income: 0, images: [<UIImage:0x6000037a8cf0 named(main: yellow1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a8e10 named(main: yellow2) 416.66666666666669, 583.33333333333337>]), outthegame.Cards(type: "yellow", income: 0, images: [<UIImage:0x6000037a8cf0 named(main: yellow1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a8e10 named(main: yellow2) 416.66666666666669, 583.33333333333337>]), outthegame.Cards(type: "yellow", income: 0, images: [<UIImage:0x6000037a8cf0 named(main: yellow1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a8e10 named(main: yellow2) 416.66666666666669, 583.33333333333337>]), outthegame.Cards(type: "yellow", income: 0, images: [<UIImage:0x6000037a8cf0 named(main: yellow1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a8e10 named(main: yellow2) 416.66666666666669, 583.33333333333337>]), outthegame.Cards(type: "yellow", income: 0, images: [<UIImage:0x6000037a8cf0 named(main: yellow1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a8e10 named(main: yellow2) 416.66666666666669, 583.33333333333337>]), outthegame.Cards(type: "blue", income: 3, images: [<UIImage:0x6000037a9170 named(main: blue1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a8f30 named(main: blue2) 416.66666666666669, 583.33333333333337>]), outthegame.Cards(type: "green", income: 1, images: [<UIImage:0x6000037a0ab0 named(main: green1) 416.66666666666669, 583.33333333333337>, <UIImage:0x6000037a0bd0 named(main: green2) 416.66666666666669, 583.33333333333337>])]

如何检查牌组是否有3张黄牌,然后将其从牌组中取出?

【问题讨论】:

你的意思是$0 == yellow => $0.type == "yellow",不是吗?您想比较卡的type,而不是卡本身与"yellow"?或者$0.type == yellow.type J.H. Christ Larme 就是这样,谢谢 【参考方案1】:

正如@jrturton 指出您的Cards 类型不符合Equatable 协议,因此您不能使用== 运算符来比较它的两个实例。

此外,您发布的代码与您的底层问题并不真正匹配:“如何检查牌组是否有 3 张黄牌,然后将它们从牌组中移除?”

在您的代码中,您只需删除 黄卡,即使它只包含 1 个黄卡

所以要回答你真正的问题,你应该首先检查牌组是否包含至少 3 张黄牌,然后移除前 3 张黄牌

var yellowsCount = 0
for card in deck where card.type == "yellow" 
    yellowsCount += 1
    guard yellowsCount < 3 else  break 

if yellowsCount == 3 
    for _ in 1...3 
      deck.removeFirst  $0.type == "yellow" 
    


当然,这个解决方案只适用于套牌中的前 3 张黄牌。你真正需要实现什么?也许删除所有 黄牌三联?那你不妨采用另一种方法:

var yellowsCount = 0
let newDeck: Array<Cards> = deck.reduce([], 
    if $1.type == "yellow" 
       yellowsCount += 1
       guard 
           yellowsCount < 3 
       else 
           yellowsCount = 0
           return $0.filter  c in c.type != "yellow" 
       
     
    return $0 + [$1]

以上所有内容均基于您打算检查Cards 上的type 属性以获取yellow 值这一事实。 无论如何,我也会推荐一种不同于对该属性使用基于字符串的方法的方法,而是使用嵌套的 enum Color 作为该值:

struct Cards 
   enum Color: CaseIterable 
       case yellow, blue, darkBlue, red, green
    
    var type: Color
    var income: Int
    var images: Array<UIImage>


通过这种方式,您将通过采用 switchif case let 构造对 type 属性进行比较:两者都比基于字符串的比较(错别字等)更不容易出错。

此外,如果您确定某个typeCard 始终具有相同的图像,则通过上述方法,您可以将images 属性转换为嵌套enum 上的计算属性,如下所示:

extension Color 
    var images: Array<UIImage> 
        switch self 
        case .yellow: return [yellowP1, yellowP2]
        case .green: return [greenP1, greenP2, greenP3]
        case .blue: return […]
        …
        
    


【讨论】:

【参考方案2】:

== 是在 Equatable 上定义的,而您的 Cards 类型不是。您要么需要使 Cards 符合 equatable,并决定您的哪些属性算作“相等”(相同类型?相同收入?两者?图像呢?),或者直接比较您关心的属性关于。

【讨论】:

以上是关于出现错误:二元运算符“==”不能应用于两个“x”操作数,如何删除此对象数组中的某些元素的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 为啥不能将二元运算符“===”应用于两个“日期”操作数?

NSError 代码检查:二元运算符“==”不能应用于两个 Int 操作数

二元运算符 += 不能应用于类型的操作数 [关闭]

二元运算符“===”不能应用于“任何?”类型的操作数和“UIBarButtonItem!”

二元运算符 % 不能应用于 UInt32 和 int 类型的操作数

Swift 3:二元运算符不能应用于 int 和“Int”类型的操作数?