-
-
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) } | |
} | |
} |
@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) }
}
Ah - forgot to add
Identifiable
protocol to theStoreR
class. It already had avar id: UUID()
.