iOS Swift:如何根据特定属性查找不同类型数组的唯一成员

iOS Swift: How to find unique members of arrays of different types based on specific attributes

目标:我有两个不同的 classes,以及两个包含每个 class 成员的数组。使用 Swift 2.0,我想根据每个 class.

的特定属性找到一个数组与另一个数组相比的唯一成员

示例:

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 之间的一些操作,returns aArray 的第 3 个和第 4 个元素,因为它们在 aArray 中是唯一的,其中比较的基础是属性 A.nameB.title.

当然,把运算顺序倒过来,会挑出bArray的第3个元素,因为它在bArray中是唯一的。

我知道我可以使用一个简单的 for 循环直接完成目标,但我希望有更优雅和更优化的东西。但是,如果 for 循环与任何更高级的东西一样快或更快,我也很乐意使用它。

我不确定这段代码是花哨还是优雅,但是,我们可以这样做:

let mappedArray = bArray.map { [=10=].title }
let filteredArray = aArray.filter { !mappedArray.contains([=10=].name) }

所以当我们想要来自 aArray 的唯一元素时,我们首先映射来自 bArray 的元素以获得我们想要实际比较的值的数组:

let mappedArray = bArray.map { [=11=].title }

mappedArray 只是基于 bArray.

中对象的 title 属性 的字符串数组

接下来,我们使用filter方法从aArray中过滤对象。 filter 方法 returns 一个包含在我们的闭包中通过测试的对象的数组。我们要应用的测试是包含在我们刚刚构建的映射数组中的对象。

let filteredArray = aArray.filter { !mappedArray.contains([=12=].name) }

如果我们想换一种方式,只需更改一些内容:

let mappedArray = aArray.map { [=13=].name }
let filteredArray = bArray.filter { !mappedArray.contains([=13=].title) }