我有一个NSArray对象:
class Object {
var name: String? = nil
var id: String? = nil
}
我想创建一个独特的NSArray名称'值。通常在Objective-C中我会使用:
NSArray *filteredArray = [array valueForKeyPath:@"@distinctUnionOfObjects.name"];
但是没有方法' valueForKeyPath'在迅速。我怎么能在swift中做到这一点?
答案 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
属性,则丢弃所有后续实例。
获取具有唯一名称的元素数组后,我使用map
将Object
的数组转换为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?]