Swift 检查数组是否包含对象时出现问题
这似乎是一个基本问题……但我对如何使用新的swift语法实现这一点感到困惑。在集合视图上点击一个按钮,我就有了这样的东西Swift 检查数组是否包含对象时出现问题,swift,Swift,这似乎是一个基本问题……但我对如何使用新的swift语法实现这一点感到困惑。在集合视图上点击一个按钮,我就有了这样的东西 let productObject = productData1[(indexPath?.row)!] self.myArray.append(productObject) 现在,当我再次单击该按钮时,我想检查myArray是否已经有productObject,这样它就不会再次添加到数组中了…希望有人能帮助 编辑:productData1是一种结构产品,类似
let productObject = productData1[(indexPath?.row)!]
self.myArray.append(productObject)
现在,当我再次单击该按钮时,我想检查myArray
是否已经有productObject
,这样它就不会再次添加到数组中了…希望有人能帮助
编辑:productData1是一种结构产品,类似于
struct Product {
let name : String
let id : String
var images = [ProductImage]()
var theRate : String
var quantity: String
var sku: String
var prdCateg: String
var prodDescr: String
var mrp: String
var prodcutImage: ProductImage?
init(name : String, id: String, theRate: String, quantity: String, sku: String, prdCateg:String, prodDescr: String, prodcutImage: ProductImage?, mrp: String) {
self.name = name
self.id = id
self.theRate = theRate
self.quantity = quantity
self.sku = sku
self.prdCateg = prdCateg
self.prodDescr = prodDescr
self.prodcutImage = prodcutImage
self.mrp = mrp
}
mutating func add(image: ProductImage) {
images.append(image)
}
}
希望这对你有帮助
let productObject = productData1[(indexPath?.row)!]
let filteredArray = self.myArray.filter(){
return $0.id == productObject.id
}
if filteredArray.count == 0 {
self.myArray.append(productObject)
}
ProductImage应符合协议均衡。那你可以 检查ProductImage的is对象是否相同,并相应地检查is images.contains(image),然后再添加新对象 要符合协议,您需要为ProductImage实现func== 差不多
func ==(lhs: ProductImage, rhs: ProductImage) -> Bool {
return lhs.imageUrl == rhs.imageUrl
}
这里有两个解决方案。第一个更有效 解决方案I-维护其他映射数据源
var myArray: [Product] = []
var myDictionary: [String : Product] = [:]
func add(newProduct product: Product) {
// Add only if product isn't contained in datasource (Test in O(1))
guard myDictionary[product.id] == nil else {
return
}
myArray.append(product)
myDictionary[product.id] = product
}
内存动机/考虑:额外数据源的内存成本相对较低,因为Swift语言复制结构的方式比较懒惰。数组和字典都保存相同的产品实例,直到其内部内容发生更改
解决方案II(效率较低)-使用集合视图的contains方法(每次迭代数组
var myArray: [Product] = []
func add(newProduct product: Product) {
// Test while `contains`
guard !myArray.contains { $0.id == product.id } else {
return
}
myArray.append(product)
}
如果您不关心对象在
myArray
中的顺序,一个解决方案就是使用集合。
首先,您需要使您的struct产品
符合Hashable
。
通过查看您的结构,我们可以假设如果两个产品的ID相等,那么它们是相等的
extension Product: Hashable {
var hashValue: Int { return id.hashValue}
static func ==(lhs: Product, rhs: Product) -> Bool {
return lhs.id == rhs.id
}
}
您可以重新定义myArray
,如下所示:
var myArray: Set<Product> = [] // Creating the Set of `Products`
// inserting product with id "123"
myArray.insert(Product(name: "name",
id: "123",
images: [],
theRate: "",
quantity: "",
sku: "",
prdCateg: "",
prodDescr: "",
mrp: "", prodcutImage: nil))
// Trying to insert product with id "123" but it already exists,
// It won't be added to myArray
myArray.insert(Product(name: "name",
id: "123",
images: [],
theRate: "",
quantity: "",
sku: "",
prdCateg: "",
prodDescr: "",
mrp: "", prodcutImage: nil))
print(myArray.count) // 1
var myArray:Set=[]//创建`产品'集合`
//插入id为“123”的产品
myArray.insert(产品名称:“名称”,
身份证号码:“123”,
图像:[],
塞拉特:“,
数量:“,
sku:“”,
prdCateg:“”,
产品描述:“,
mrp:,产品图像:无)
//正在尝试插入id为“123”的产品,但该产品已存在,
//它不会被添加到myArray中
myArray.insert(产品名称:“名称”,
身份证号码:“123”,
图像:[],
塞拉特:“,
数量:“,
sku:“”,
prdCateg:“”,
产品描述:“,
mrp:,产品图像:无)
打印(myArray.count)//1
是什么类型的productData1
?它是一种结构产品。像这样…var productData1=[Product]()这在数组文档中有很好的介绍。你读过吗?Product
是一个类吗?它是一个struct@SalmanGhumsani…我已经更新了这个问题…强制展开不好–id
不是可选的–使用filter
而不是contains
是无效的。你的解决方案也有效,@Bapu…但接受了ot由于给出了更详细的答案,所以她给出了一个向上投票的结果…:)我必须在我想添加/不添加元素到数组的地方调用此方法,对吗?@bws-是的,在需要的地方调用add(newProduct:)方法,以便将新对象添加到数组中。正如我所说,在我看来,第一个选择更好。很高兴我能帮忙:-)