如何从对象的NSArray中创建唯一键的NSArray?

3

我有一个对象的NSArray:

class Object {
    var name: String? = nil
    var id: String? = nil
}

我希望创建一个包含唯一“name”值的NSArray。通常在Objective-C中,我会使用以下代码:

NSArray *filteredArray = [array valueForKeyPath:@"@distinctUnionOfObjects.name"]; 

在 Swift 中不存在 'valueForKeyPath' 方法。那么我该如何在 Swift 中做到这一点呢?


1
你可以像这样使用:var max = (numbers as AnyObject).valueForKeyPath("@max.self") as Double,希望这能帮到你。 - Urmi
2个回答

3

没有直接的方法可以做到这一点 - 至少我不知道有任何方法。

实现这个算法的方法是使用字典来跟踪唯一名称,并利用“filter”和“map”:

var dict = [String : Bool]()

let filtered = array.filter { (element: Object) -> Bool in
    if let name = element.name {
        if dict[name] == nil {
            dict[element.name!] = true
            return true
        }
    }
    return false
}

let names = filtered.map { $0.name!}
dict 存储已处理的名称作为键,并将布尔值作为值(该值被忽略)。
我使用filter生成一个包含Object元素的数组,其中name属性是唯一的,即如果在字典中找到name属性,则舍弃所有后续实例。
一旦获得了具有唯一名称的元素数组,我就使用mapObject数组转换为String数组,从每个Object实例中获取name属性。
如果您要在多个地方重复使用此方法,则最好将其添加为Array类型的扩展方法。

1
你仍然可以使用NSArray的功能,只需确保你的Object扩展了NSObject:
class Object:NSObject {
    var name: String? = nil
    var id: String? = nil
}

let originalArray = [Object(), Object()]
let array = NSArray(array: originalArray)
let result = array.valueForKeyPath("@distinctUnionOfObjects.name") as [String?]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接