我有两个数组
let badContents = ["b1", "b2"]
let things: [Thing] = ...
Thing 有自己的内容,像这样
print(things[0].contents)
// ["g1", "b1", "b2"]
我想做类似下面的事情,在那里我会得到一个 Thing
类型的数组,其元素的内容不与另一个数组重叠,badContents
func filteredThings() -> [Thing] {
return things.filter({ (thing) -> Bool in {
return // thing.contents and badContents do not share any elements
}()
})
}
因此,我会得到这样的结果
let things = [Thing(name: "1", contents: ["g1", "b2"), Thing(name: "2", contents: ["g1", "g2"])]
let goodThings = filteredThings() // removes Thing named "1" because its contents contain "b2"
for goodThing in goodThings {
print(goodThing.name)
// "2"
}
最佳答案
它可能对性能没有太大影响(除非 badThings
很大,或者 contents
都很大而且“坏事”很常见),但我' d 可能仍然这样做,而不需要任何新的扩展:
let badContents = Set(["b1", "b2"])
func filteredThings() -> [Thing] {
return things.filter { $0.contents.first(where: { badContents.contains($0) }) == nil }
}
即使您继续靠近,当您发现碰撞时我也会停止搜索。找到所有的冲突然后检查 .count == 0
只是一种浪费,而且不是特别容易阅读。
或者,虽然在时间和空间上效率稍低,但以下 IMO 非常明确:
let badContents = Set(["b1", "b2"])
func filteredThings2() -> [Thing] {
return things.filter { Set($0.contents).intersection(badContents).isEmpty }
}
关于arrays - 涉及数组和具有数组成员的对象的复杂过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732799/