-
-
Save Gujci/8307ab63bec7143486cab8dfa258acfd to your computer and use it in GitHub Desktop.
| import RealmSwift | |
| typealias Model = Object & Identifiable | |
| struct ListKey<T: Model>: Identifiable { | |
| let id: T.ID | |
| } | |
| extension Results where Element: Model { | |
| subscript(key: ListKey<Element>) -> Element? { | |
| Element.primaryKey().flatMap { self.filter("\($0) = %@", key.id).first } | |
| } | |
| var keyedEnumeration: [ListKey<Element>] { | |
| guard let key = Element.primaryKey() else { return [] } | |
| let keys = value(forKey: key) as! [Element.ID] | |
| return keys.enumerated().map { ListKey(id: $0.1) } | |
| } | |
| } |
Ah - forgot to add Identifiable protocol to the StoreR class. It already had a var id: UUID().
@Gujci can you create an extension for RealmSwift.List - my attempt fails with en error on "value(forKey: key)" - ambiguous use but I don't really understand why.
extension RealmSwift.List where Element: Model {
subscript(key: ListKey<Element>) -> Element? {
Element.primaryKey().flatMap { self.filter("\($0) = %@", key.id).first }
}
var keyedEnumeration: [ListKey<Element>] {
guard let key = Element.primaryKey() else { return [] }
let keys = value(forKey: key) as! [Element.ID]
return keys.enumerated().map { ListKey(id: $0.1) }
}
}
@duncangroenewald that is because RealmSwift.List s value(forKey: key) is different from the Results s. It returns [AnyObject] instead of Any.
let keys: [AnyObject] = value(forKey: key) compiles but it requires a cast to occur later in return keys.enumerated().map { ListKey(id: $0.1) } like
return keys.enumerated().map { ListKey(id: $0.1 as! Element.ID) }
I have not tried whether it works or not. I suppose the key is usually a String or Int, and none of them conforms to AnyObject so this might crash.
An other hacky solution, to convert the List to Results with a simple filtering. As far as I know realm handles this very well, so not much performance is lost.
var keyedEnumeration: [ListKey<Element>] {
guard let key = Element.primaryKey() else { return [] }
let keys = filter("TRUEPREDICATE").value(forKey: key) as! [Element.ID]
return keys.enumerated().map { ListKey(id: $0.1) }
}
The error states that
StoreRis notIdentifiable.