быстрые данные NSP предиката (структура) - PullRequest
0 голосов
/ 24 октября 2019

В действительности я сохраняю данные структуры следующим образом

class DBDialogs: Object {
    @objc dynamic var userId = 0
    @objc dynamic var initials = ""
    @objc private dynamic var structData:Data? = nil
    var Info : User? {
        get {
            if let data = structData {
                do {
                    return try JSONDecoder().decode(User.self, from: data)
                }catch {
                    return nil
                }
            }
            return nil
        }
        set {
            structData = try? JSONEncoder().encode(newValue)
        }
    }
}
struct User : Codable {
var pk : Int?
var email : String?
var brand : String?
var discs : Discs?

enum CodingKeys: String, CodingKey {

    case pk = "pk"
    case email = "email"
    case brand = "brand"
    case discs = "discs"
}

init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    pk = try values.decodeIfPresent(Int.self, forKey: .pk)
    email = try values.decodeIfPresent(String.self, forKey: .email)
    brand = try values.decodeIfPresent(String.self, forKey: .brand)
    discs = try values.decodeIfPresent(Discs.self, forKey: .discs)
}

}

Как я могу отфильтровать данные структуры? пробуя что-то вроде этого, но я получаю ошибку (Unable to parse the format string "Info?.brand == %@")

var dbDialogsArray: Results<DBDialogs>?
var dbDialogsMethods = DBDialogsMethods()
....

class DBDialogsMethods { // also in this class i will write to realm, update, delete and etc
    var realm: Realm!
    func getArray() -> Results<DBDialogs> {
        return realm.objects(DBDialogs.self)
    }
}

....

let realm = try! Realm()
dbDialogsMethods.realm = realm
dbDialogsArray = dbDialogsMethods.getArray()
...

let predicate = NSPredicate(format: "Info?.brand = %@", brandField.text!)
let filteredDialogs = dbDialogsArray?.filter(predicate)

У меня есть массив DBDialogs, мне нужно отфильтровать массив по полям в Info (structData)

Почему яделать с NSPredicate: у меня есть несколько полей, по которым я фильтрую данные (поля для фильтрации выбираются вручную в приложении), используя NSPredicate, я могу отфильтровать несколько полей, выбранных пользователем в приложении, что-то вроде

var stringPredicate = Dictionary <String, NSObject> ()
stringPredicate ["brand"] = brand.text! as NSObject
var generalPredicates = [NSPredicate] ()
        for (key, value) in stringPredicate {
            let predicate = NSPredicate (format: "% K =% @", key, value)
            generalPredicates.append (predicate)
        }

и фильтровать все сразу, я не знаю, как сделать фильтрацию по-другому с условием, что вам нужно фильтровать только те поля, которые пользователь выбрал в приложении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...