Skip to content

Instantly share code, notes, and snippets.

@Gujci
Last active March 9, 2021 14:12
Show Gist options
  • Save Gujci/8307ab63bec7143486cab8dfa258acfd to your computer and use it in GitHub Desktop.
Save Gujci/8307ab63bec7143486cab8dfa258acfd to your computer and use it in GitHub Desktop.
Wrapper to bridge realms auto updating behaviour with SwiftUIs value based immutability requirement. (Extract from https://stackoverflow.com/questions/57160790/index-out-of-bounds-when-using-realm-with-swiftui)
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
Copy link
Author

Gujci commented Apr 7, 2020

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) }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment