123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- import Foundation
- import Realm
- public protocol MinMaxType {}
- extension NSNumber: MinMaxType {}
- extension Double: MinMaxType {}
- extension Float: MinMaxType {}
- extension Int: MinMaxType {}
- extension Int8: MinMaxType {}
- extension Int16: MinMaxType {}
- extension Int32: MinMaxType {}
- extension Int64: MinMaxType {}
- extension Date: MinMaxType {}
- extension NSDate: MinMaxType {}
- public protocol AddableType {
-
- init()
- }
- extension NSNumber: AddableType {}
- extension Double: AddableType {}
- extension Float: AddableType {}
- extension Int: AddableType {}
- extension Int8: AddableType {}
- extension Int16: AddableType {}
- extension Int32: AddableType {}
- extension Int64: AddableType {}
- public struct Results<Element: RealmCollectionValue>: Equatable {
- internal let rlmResults: RLMResults<AnyObject>
-
- public var description: String {
- return RLMDescriptionWithMaxDepth("Results", rlmResults, RLMDescriptionMaxDepth)
- }
-
- public typealias ElementType = Element
-
-
- public var realm: Realm? { return Realm(rlmResults.realm) }
-
- public var isInvalidated: Bool { return rlmResults.isInvalidated }
-
- public var count: Int { return Int(rlmResults.count) }
-
- internal init(_ rlmResults: RLMResults<AnyObject>) {
- self.rlmResults = rlmResults
- }
-
-
- public func index(of object: Element) -> Int? {
- return notFoundToNil(index: rlmResults.index(of: object as AnyObject))
- }
-
- public func index(matching predicate: NSPredicate) -> Int? {
- return notFoundToNil(index: rlmResults.indexOfObject(with: predicate))
- }
-
- public func index(matching predicateFormat: String, _ args: Any...) -> Int? {
- return notFoundToNil(index: rlmResults.indexOfObject(with: NSPredicate(format: predicateFormat,
- argumentArray: unwrapOptionals(in: args))))
- }
-
-
- public subscript(position: Int) -> Element {
- throwForNegativeIndex(position)
- return dynamicBridgeCast(fromObjectiveC: rlmResults.object(at: UInt(position)))
- }
-
- public var first: Element? { return rlmResults.firstObject().map(dynamicBridgeCast) }
-
- public var last: Element? { return rlmResults.lastObject().map(dynamicBridgeCast) }
-
-
- public func value(forKey key: String) -> Any? {
- return value(forKeyPath: key)
- }
-
- public func value(forKeyPath keyPath: String) -> Any? {
- return rlmResults.value(forKeyPath: keyPath)
- }
-
- public func setValue(_ value: Any?, forKey key: String) {
- return rlmResults.setValue(value, forKeyPath: key)
- }
-
-
- public func filter(_ predicateFormat: String, _ args: Any...) -> Results<Element> {
- return Results<Element>(rlmResults.objects(with: NSPredicate(format: predicateFormat,
- argumentArray: unwrapOptionals(in: args))))
- }
-
- public func filter(_ predicate: NSPredicate) -> Results<Element> {
- return Results<Element>(rlmResults.objects(with: predicate))
- }
-
-
- public func sorted(byKeyPath keyPath: String, ascending: Bool = true) -> Results<Element> {
- return sorted(by: [SortDescriptor(keyPath: keyPath, ascending: ascending)])
- }
-
- public func sorted<S: Sequence>(by sortDescriptors: S) -> Results<Element>
- where S.Iterator.Element == SortDescriptor {
- return Results<Element>(rlmResults.sortedResults(using: sortDescriptors.map { $0.rlmSortDescriptorValue }))
- }
-
- public func distinct<S: Sequence>(by keyPaths: S) -> Results<Element>
- where S.Iterator.Element == String {
- return Results<Element>(rlmResults.distinctResults(usingKeyPaths: Array(keyPaths)))
- }
-
-
- public func min<T: MinMaxType>(ofProperty property: String) -> T? {
- return rlmResults.min(ofProperty: property).map(dynamicBridgeCast)
- }
-
- public func max<T: MinMaxType>(ofProperty property: String) -> T? {
- return rlmResults.max(ofProperty: property).map(dynamicBridgeCast)
- }
-
- public func sum<T: AddableType>(ofProperty property: String) -> T {
- return dynamicBridgeCast(fromObjectiveC: rlmResults.sum(ofProperty: property))
- }
-
- public func average<T: AddableType>(ofProperty property: String) -> T? {
- return rlmResults.average(ofProperty: property).map(dynamicBridgeCast)
- }
-
-
- public func observe(_ block: @escaping (RealmCollectionChange<Results>) -> Void) -> NotificationToken {
- return rlmResults.addNotificationBlock { _, change, error in
- block(RealmCollectionChange.fromObjc(value: self, change: change, error: error))
- }
- }
- }
- extension Results: RealmCollection {
-
-
- public func makeIterator() -> RLMIterator<Element> {
- return RLMIterator(collection: rlmResults)
- }
-
-
- public func _asNSFastEnumerator() -> Any {
- return rlmResults
- }
-
-
-
- public var startIndex: Int { return 0 }
-
-
-
- public var endIndex: Int { return count }
- public func index(after i: Int) -> Int { return i + 1 }
- public func index(before i: Int) -> Int { return i - 1 }
-
- public func _observe(_ block: @escaping (RealmCollectionChange<AnyRealmCollection<Element>>) -> Void) ->
- NotificationToken {
- let anyCollection = AnyRealmCollection(self)
- return rlmResults.addNotificationBlock { _, change, error in
- block(RealmCollectionChange.fromObjc(value: anyCollection, change: change, error: error))
- }
- }
- }
- extension Results: AssistedObjectiveCBridgeable {
- internal static func bridging(from objectiveCValue: Any, with metadata: Any?) -> Results {
- return Results(objectiveCValue as! RLMResults)
- }
- internal var bridged: (objectiveCValue: Any, metadata: Any?) {
- return (objectiveCValue: rlmResults, metadata: nil)
- }
- }
- #if swift(>=4.1)
- extension Results: Encodable where Element: Encodable {
- public func encode(to encoder: Encoder) throws {
- var container = encoder.unkeyedContainer()
- for value in self {
- try container.encode(value)
- }
- }
- }
- #endif
|