出现错误:二元运算符“==”不能应用于两个“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>
通过这种方式,您将通过采用 switch
或 if case let
构造对 type
属性进行比较:两者都比基于字符串的比较(错别字等)更不容易出错。
此外,如果您确定某个type
的Card
始终具有相同的图像,则通过上述方法,您可以将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!”