123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- ////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2014 Realm Inc.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- //
- ////////////////////////////////////////////////////////////////////////////
- //
- // SPDX-FileCopyrightText: 2014 Realm Inc.
- // SPDX-License-Identifier: Apache-2.0
- //
- import Realm
- extension RLMRealm {
- /**
- Returns the schema version for a Realm at a given local URL.
- - see: `+ [RLMRealm schemaVersionAtURL:encryptionKey:error:]`
- */
- @nonobjc public class func schemaVersion(at url: URL, usingEncryptionKey key: Data? = nil) throws -> UInt64 {
- var error: NSError?
- let version = __schemaVersion(at: url, encryptionKey: key, error: &error)
- guard version != RLMNotVersioned else { throw error! }
- return version
- }
- /**
- Returns the same object as the one referenced when the `RLMThreadSafeReference` was first created,
- but resolved for the current Realm for this thread. Returns `nil` if this object was deleted after
- the reference was created.
- - see `- [RLMRealm resolveThreadSafeReference:]`
- */
- @nonobjc public func resolve<Confined>(reference: RLMThreadSafeReference<Confined>) -> Confined? {
- return __resolve(reference as! RLMThreadSafeReference<RLMThreadConfined>) as! Confined?
- }
- }
- extension RLMObject {
- /**
- Returns all objects of this object type matching the given predicate from the default Realm.
- - see `+ [RLMObject objectsWithPredicate:]`
- */
- public class func objects(where predicateFormat: String, _ args: CVarArg...) -> RLMResults<RLMObject> {
- return objects(with: NSPredicate(format: predicateFormat, arguments: getVaList(args))) as! RLMResults<RLMObject>
- }
- /**
- Returns all objects of this object type matching the given predicate from the specified Realm.
- - see `+ [RLMObject objectsInRealm:withPredicate:]`
- */
- public class func objects(in realm: RLMRealm,
- where predicateFormat: String,
- _ args: CVarArg...) -> RLMResults<RLMObject> {
- return objects(in: realm, with: NSPredicate(format: predicateFormat, arguments: getVaList(args))) as! RLMResults<RLMObject>
- }
- }
- /// A protocol defining iterator support for RLMArray, RLMSet & RLMResults.
- public protocol _RLMCollectionIterator {
- /**
- Returns a `RLMCollectionIterator` that yields successive elements in the collection.
- This enables support for sequence-style enumeration of `RLMObject` subclasses in Swift.
- */
- func makeIterator() -> RLMCollectionIterator
- }
- extension _RLMCollectionIterator where Self: RLMCollection {
- /// :nodoc:
- public func makeIterator() -> RLMCollectionIterator {
- return RLMCollectionIterator(self)
- }
- }
- /// :nodoc:
- public typealias RLMDictionarySingleEntry = (key: String, value: RLMObject)
- /// A protocol defining iterator support for RLMDictionary
- public protocol _RLMDictionaryIterator {
- /// :nodoc:
- func makeIterator() -> RLMDictionaryIterator
- }
- extension _RLMDictionaryIterator where Self: RLMCollection {
- /// :nodoc:
- public func makeIterator() -> RLMDictionaryIterator {
- return RLMDictionaryIterator(self)
- }
- }
- // Sequence conformance for RLMArray, RLMDictionary, RLMSet and RLMResults is provided by RLMCollection's
- // `makeIterator()` implementation.
- extension RLMArray: Sequence, _RLMCollectionIterator { }
- extension RLMDictionary: Sequence, _RLMDictionaryIterator {}
- extension RLMSet: Sequence, _RLMCollectionIterator {}
- extension RLMResults: Sequence, _RLMCollectionIterator {}
- /**
- This struct enables sequence-style enumeration for RLMObjects in Swift via `RLMCollection.makeIterator`
- */
- public struct RLMCollectionIterator: IteratorProtocol {
- private var iteratorBase: NSFastEnumerationIterator
- internal init(_ collection: RLMCollection) {
- iteratorBase = NSFastEnumerationIterator(collection)
- }
- public mutating func next() -> RLMObject? {
- return iteratorBase.next() as! RLMObject?
- }
- }
- /**
- This struct enables sequence-style enumeration for RLMDictionary in Swift via `RLMDictionary.makeIterator`
- */
- public struct RLMDictionaryIterator: IteratorProtocol {
- private var iteratorBase: NSFastEnumerationIterator
- private let dictionary: RLMDictionary<AnyObject, AnyObject>
- internal init(_ collection: RLMCollection) {
- dictionary = collection as! RLMDictionary<AnyObject, AnyObject>
- iteratorBase = NSFastEnumerationIterator(collection)
- }
- public mutating func next() -> RLMDictionarySingleEntry? {
- let key = iteratorBase.next()
- if let key = key {
- return (key: key as Any, value: dictionary[key as AnyObject]) as? RLMDictionarySingleEntry
- }
- if key != nil {
- fatalError("unsupported key type")
- }
- return nil
- }
- }
- // Swift query convenience functions
- extension RLMCollection {
- /**
- Returns the index of the first object in the collection matching the predicate.
- */
- public func indexOfObject(where predicateFormat: String, _ args: CVarArg...) -> UInt {
- guard let index = indexOfObject?(with: NSPredicate(format: predicateFormat, arguments: getVaList(args))) else {
- fatalError("This RLMCollection does not support indexOfObject(where:)")
- }
- return index
- }
- /**
- Returns all objects matching the given predicate in the collection.
- */
- public func objects(where predicateFormat: String, _ args: CVarArg...) -> RLMResults<NSObject> {
- return objects(with: NSPredicate(format: predicateFormat, arguments: getVaList(args))) as! RLMResults<NSObject>
- }
- }
- extension RLMCollection {
- /// Allows for subscript support with RLMDictionary.
- public subscript(_ key: String) -> AnyObject? {
- get {
- (self as! RLMDictionary<NSString, AnyObject>).object(forKey: key as NSString)
- }
- set {
- (self as! RLMDictionary<NSString, AnyObject>).setObject(newValue, forKey: key as NSString)
- }
- }
- }
|