Swift 检查数组是否包含对象时出现问题

Swift 检查数组是否包含对象时出现问题,swift,Swift,这似乎是一个基本问题……但我对如何使用新的swift语法实现这一点感到困惑。在集合视图上点击一个按钮,我就有了这样的东西 let productObject = productData1[(indexPath?.row)!] self.myArray.append(productObject) 现在,当我再次单击该按钮时,我想检查myArray是否已经有productObject,这样它就不会再次添加到数组中了…希望有人能帮助 编辑:productData1是一种结构产品,类似

这似乎是一个基本问题……但我对如何使用新的swift语法实现这一点感到困惑。在集合视图上点击一个按钮,我就有了这样的东西

    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:)方法,以便将新对象添加到数组中。正如我所说,在我看来,第一个选择更好。很高兴我能帮忙:-)