如何创建NSArray的唯一键表单对象NSArray?

时间:2014-10-14 10:14:43

标签: ios objective-c swift ios8 nsarray

我有一个NSArray对象:

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

我想创建一个独特的NSArray名称'值。通常在Objective-C中我会使用:

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

但是没有方法' valueForKeyPath'在迅速。我怎么能在swift中做到这一点?

2 个答案:

答案 0 :(得分:3)

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

实现这一目标的算法是使用字典来跟踪唯一名称,并利用“过滤器”和“地图”:

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数组,并取name属性来自每个Object实例。

如果您要在多个地方重复使用此方法,最好将其作为扩展方法添加到Array类型。

答案 1 :(得分: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?]