В действительности я сохраняю данные структуры следующим образом
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)
}
и фильтровать все сразу, я не знаю, как сделать фильтрацию по-другому с условием, что вам нужно фильтровать только те поля, которые пользователь выбрал в приложении