talk-ios/NextcloudTalk/RLMSupport.swift

179 строки
6.5 KiB
Swift

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