首页 > 解决方案 > 如何在枚举器 Swift 中使用 contains(where:)

问题描述

我找不到带有枚举器的 contains(where:) 的语法示例。

我正在尝试映射数组 1 和数组 2 以查看是否有任何重复并更新它。如果不附加无重复部分。

struct Info {
    var id: Int
    var info: String
}

var arrayOne: [Info] = [Info(id: 0, info: "I don't like cake"),
                        Info(id: 2, info: "I love soda")]

var arrayTwo: [Info] = [Info(id: 0, info: "I love cake"),
                        Info(id: 1, info: "I love chocolate"),
                        Info(id: 2, info: "I love Milk")]
    
for arr in arrayOne {
   if arrayTwo.enumerated().contains(where: (index, element) in 
//    checking $0.id == arr.id is true
//    then update the array arrayTwo[index] = arr  
   } else {
      arrayTwo.append(arr)
   }
 }

标签: arraysswift

解决方案


你的代码都不是合法的 Swift。我假设你的意思是:

struct Info {
    var id: Int
    var info: String
}

var arrayOne: [Info] = [Info(id: 0, info: "I don't like cake"),
                        Info(id: 2, info: "I love soda")]

var arrayTwo: [Info] = [Info(id: 0, info: "I love cake"),
                        Info(id: 1, info: "I love chocolate"),
                        Info(id: 2, info: "I love Milk")]

鉴于此,contains(where:)对于您要解决的问题没有用处。您不能仅基于知道数组包含一个值来更新;您需要知道值的实际位置。为此你想要firstIndex(where:)

for arr in arrayOne {
    // Find a matching index
    if let index = arrayTwo.firstIndex(where: { $0.id == arr.id }) {
        // And if it exists, replace it
        arrayTwo[index] = arr
    } else {
        // Otherwise, append
        arrayTwo.append(arr)
    }
}

推荐阅读