目标:我有两个不同的类,以及两个包含每个类成员的数组。使用Swift 2.0,我想根据每个类的特定属性找到一个数组的唯一成员与另一个数组的比较。
示例:
class A {
var name: String
init(name: String) {
self.name = name
}
}
class B {
var title: String
init(title: String) {
self.title = title
}
}
let aArray = [A(name:"1"), A(name:"2"), A(name:"3"), A(name:"4")]
let bArray = [B(title:"1"), B(title:"2"), B(title:"5")]
所以,我正在寻找aArray和bArray之间的一些操作,它返回aArray的第3和第4个元素,因为它们在aArray中是唯一的,其中比较的基础是属性A.name
和{ {1}}。
当然,颠倒操作的顺序会选出bArray的第3个元素,因为它在bArray中是唯一的。
我知道我可以使用简单的for循环直接完成目标,但我希望有更优雅和更优化的东西。但是如果for循环比任何更高级的东西更快或更快,我也很高兴也能使用它。
答案 0 :(得分:6)
我不确定这段代码的花哨或优雅,但是,我们可以这样做:
let mappedArray = bArray.map { $0.title }
let filteredArray = aArray.filter { !mappedArray.contains($0.name) }
因此,当我们想要aArray
中的唯一元素时,我们首先映射bArray
中的元素以获取我们想要实际比较的值的数组:
let mappedArray = bArray.map { $0.title }
mappedArray
只是一个基于title
中对象的bArray
属性的字符串数组。
接下来,我们使用filter
方法过滤aArray
中的对象。 filter
方法返回一个数组,其中包含在闭包中传递测试的对象。我们要应用的测试是我们刚刚构建的映射数组中包含 not 的对象。
let filteredArray = aArray.filter { !mappedArray.contains($0.name) }
如果我们想以另一种方式去做,只需改变一些事情:
let mappedArray = aArray.map { $0.name }
let filteredArray = bArray.filter { !mappedArray.contains($0.title) }