在 NSMutableArray 中搜索

Search in NSMutableArray

我想使用键值在 NSMUtableArray 上进行搜索以捕获孔对象,而不仅仅是一个值数组,例如我的 NSMUtableArray return 我

{id : 1, name : x1}
{id : 2, name : x2}
{id : 3, name : x3}
{id : 4, name : y1}
{id : 5, name : y2}

如果我正在搜索 x 我的代码 return 我

{x1,x2,x3} 

或者我想要 return

{id : 1, name : x1}
{id : 2, name : x2}
{id : 3, name : x3}

我的代码是:

 let arrayy = lstResults.value(forKey: "name")
 let searchTest = NSPredicate(format: "SELF BEGINSWITH   [c] %@", searchBar.text!)
 let array = (arrayy as! NSArray).filtered(using: searchTest)
 filteredTableDataName = array as NSArray

请帮助我尝试了很多东西,但没有任何效果。

您可以直接过滤数组,而不是提取和过滤 "name" 值,使用相应的键路径而不是谓词中的“SELF”:

let array = NSArray(array: [
    ["id": 1, "name": "x1"], ["id": 2, "name": "x2"], ["id": 3, "name": "y3"]])

let predicate = NSPredicate(format: "name BEGINSWITH [c] %@", "x")
let filtered = array.filtered(using: predicate)

print(filtered)

结果:

[{
    id = 1;
    name = x1;
}, {
    id = 2;
    name = x2;
}]

另一种选择是将 NS(Mutable)Array 转换为 Swift 字典数组,并使用 filter() 函数:

if let a = array as? [[String: Any]] {
    let filtered = a.filter {
        ([=12=]["name"] as? String)?
            .range(of: "x", options: [.caseInsensitive, .anchored]) != nil
    }
    print(filtered)
    // [["id": 1, "name": x1], ["name": x2, "id": 2]]
}

NSMutableArray(或 NSArray 就此而言)是 'Objective-c' 时代的遗留物。
为此目的,没有真正需要使用它或不使用 Swift 的标准通用 Array<Element> => https://developer.apple.com/documentation/swift/array

我是否可以考虑创建一个结构而不是使用字典:

import Foundation

struct Obj {
    let id: Int
    let name: String
}

let array = [
    Obj(id: 1, name: "x1"),
    Obj(id: 2, name: "x2"),
    Obj(id: 3, name: "X3"),
    Obj(id: 4, name: "y1"),
    Obj(id: 5, name: "y2")
]

let filteredArray = array.filter { [=10=].name.localizedLowercase.hasPrefix("x") }
// filteredArray = [
//       Obj(id: 1, name: "x1"),
//       Obj(id: 2, name: "x2"),
//       Obj(id: 3, name: "X3")
// ]

否则你会得到这样的东西:

import Foundation

let array: [[String: Any]] = [
    [ "id": 1, "name": "x1" ],
    [ "id": 2, "name": "x2" ],
    [ "id": 3, "name": "X3" ],
    [ "id": 4, "name": "y1" ],
    [ "id": 5, "name": "y2" ]
]

let filteredArray = array.filter { ([=11=]["name"] as? String)?.localizedLowercase.hasPrefix("x") == true }