【问题标题】:How to create NSArray of unique key form objects NSArray?如何创建唯一键表单对象 NSArray 的 NSArray?
【发布时间】:2023-03-12 07:40:01
【问题描述】:

我有一个 NSArray 对象:

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

我想创建一个具有唯一“名称”值的 NSArray。通常在 Objective-C 中我会使用:

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

但是swift中没有方法'valueForKeyPath'。我怎样才能快速做到这一点?

【问题讨论】:

  • 你可以这样使用: var max = (numbers as AnyObject).valueForKeyPath("@max.self") as Double 希望这会对你有所帮助..

标签: ios objective-c swift ios8 nsarray


【解决方案1】:

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

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

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 属性,则丢弃所有后续实例。

一旦获得具有唯一名称的元素数组,我使用mapObjects 的数组转换为String 的数组,从每个Object 实例中获取name 属性。

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

【讨论】:

    【解决方案2】:

    您仍然可以使用 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?]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 2018-08-10
      • 2013-08-28
      • 1970-01-01
      • 2011-06-19
      • 2010-11-29
      相关资源
      最近更新 更多