Искать в NSMutableArray - PullRequest
       27

Искать в NSMutableArray

0 голосов
/ 10 октября 2019

Я хотел бы выполнить поиск по NSMUtableArray по ключевым значениям, чтобы поймать объект дырки, а не просто массив значений, поэтому, например, мой NSMUtableArray возвращает мне

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

, если я ищуиз х мой код верните мне

{x1,x2,x3} 

или я хочу, чтобы он вернулся

{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

пожалуйста, помогите, я много пробовалвещи, но ничего не получалось от меня.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

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 { $0.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 { ($0["name"] as? String)?.localizedLowercase.hasPrefix("x") == true }
0 голосов
/ 10 октября 2019

Вместо извлечения и фильтрации значений "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 {
        ($0["name"] as? String)?
            .range(of: "x", options: [.caseInsensitive, .anchored]) != nil
    }
    print(filtered)
    // [["id": 1, "name": x1], ["name": x2, "id": 2]]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...