结构体
以下结构在全局范围内可用。
-
该结构体通过以下方式在 Swift 中启用 RLMObjects 的序列式枚举:
查看更多RLMCollection.makeIterator
声明
Swift
public struct RLMCollectionIterator : IteratorProtocol
-
此结构体通过以下方式在 Swift 中启用 RLMDictionary 的序列式枚举:
查看更多RLMDictionary.makeIterator
声明
Swift
public struct RLMDictionaryIterator : IteratorProtocol
-
一个
Realm
实例(也称为“Realm”)代表一个 Realm 数据库。Realm 可以存储在磁盘上(请参阅
init(path:)
)或内存中(请参阅Configuration
)。Realm
实例在内部缓存,构造等效的Realm
对象(例如,通过使用相同的路径或标识符)产生的开销有限。如果您特别希望确保销毁
Realm
实例(例如,如果您希望打开 Realm,检查某些属性,然后可能删除 Realm 文件并重新打开它),请将使用 Realm 文件的代码放在autoreleasepool {}
内,并确保没有其他强引用对其进行强引用。警告
未冻结的RLMRealm
实例受线程限制,不能跨线程或调度队列共享。 尝试这样做会导致抛出异常。 您必须在要与 Realm 交互的每个线程或队列上获取RLMRealm
的实例。 在获取RLMRealm
实例时,可以通过显式传入队列来将 Realm 限制为调度队列,而不是打开 Realm 的线程。 如果不这样做,尝试在分派到同一队列的多个区块中使用同一实例可能会失败,因为队列并不总是在同一线程上运行。声明
Swift
@frozen public struct Realm
extension Realm: Equatable
-
LinkingObjects
是一种自动更新的container类型。它表示通过属性关系链接到其所属模型对象的零个或多个对象。LinkingObjects
可以使用与List<Element>
和Results<Element>
相同的谓词进行查询。LinkingObjects
始终反映当前线程上的 Realm 的当前状态,包括在当前线程上的写事务(write transaction)期间。唯一的例外是使用for...in
枚举时,该枚举将始终枚举开始枚举时存在的链接对象,即使其中一些对象在枚举期间被删除或修改为不再链接到目标对象。 。
查看更多LinkingObjects
只能用作Object
模型上的属性。声明
Swift
@frozen public struct LinkingObjects<Element> : RealmCollectionImpl where Element : RLMObjectBase, Element : RealmCollectionValue
extension LinkingObjects: RealmSubscribable
extension LinkingObjects: LinkingObjectsProtocol
-
Results
是 Realm 中从对象查询返回的自动更新container类型。Results
可以使用与List<Element>
相同的谓词进行查询,并且可以链式查询以进一步筛选查询结果。Results
始终反映当前线程上的 Realm 的当前状态,包括在当前线程上的写事务(write transaction)期间。唯一的例外是使用for...in
枚举时,该枚举将始终枚举开始枚举时与查询匹配的对象,即使其中一些对象在枚举期间被删除或修改为被筛选器排除。Results
首次访问时延迟求值;它们仅在请求查询结果时才运行查询。 这意味着链接多个临时Results
来对数据进行排序和筛选不会执行任何不必要的中间状态处理工作。评估结果或添加通知块后,系统会立即使结果保持最新,并尽可能在背景线程上完成保持最新的工作。
结果实例无法直接实例化。
查看更多声明
Swift
@frozen public struct Results<Element> : Equatable, RealmCollectionImpl where Element : RealmCollectionValue
extension Results: RealmSubscribable
extension Results: Encodable where Element: Encodable
-
查看更多SectionedResults
是一个类型安全的collection,其中包含单个ResultsSection
作为其元素。container是延迟评估的,这意味着如果底层collection发生更改,则会对部分键进行完全重新计算。可以观察SectionedResults
实例,并且它也符合ThreadConfined
。声明
Swift
public struct SectionedResults<Key, SectionElement> : SectionedResultImpl where Key : _Persistable, Key : Hashable, SectionElement : RealmCollectionValue
extension SectionedResults: RealmSubscribable
-
查看更多ResultsSection
是一个collection,允许访问属于给定部分键的对象。该集合是延迟评估的,这意味着如果底层集合已更改,则会对部分键进行完全重新计算。 可以观察ResultsSection
实例,并且它也符合ThreadConfined
。声明
Swift
public struct ResultsSection<Key, T> : SectionedResultImpl where Key : _Persistable, Key : Hashable, T : RealmCollectionValue
extension ResultsSection: RealmSubscribable
extension ResultsSection: Identifiable
-
类型擦除的
RealmCollection
。
查看更多RealmCollection
的实例将操作转发到具有相同Element
类型的不透明底层集合。 此类型可用于编写可操作或存储多种类型的 Realm collection的非泛型代码。与直接使用原始集合相比,它没有任何运行时开销。声明
Swift
@frozen public struct AnyRealmCollection<Element> : RealmCollectionImpl where Element : RealmCollectionValue
extension AnyRealmCollection: RealmSubscribable
extension AnyRealmCollection: Encodable where Element: Encodable
-
ProjectedCollection 是投影属性的一种特殊集合类型,当您要将 Realm 对象的
List
投影为值列表时,应使用该集合。 您无需手动实例化此类型。 通过在List
属性上调用projectTo
来使用它:
查看更多class PersistedListObject: Object { @Persisted public var people: List<CommonPerson> } class ListProjection: Projection<PersistedListObject> { @Projected(\PersistedListObject.people.projectTo.firstName) var strings: ProjectedCollection<String> }
声明
Swift
public struct ProjectedCollection<Element> : RandomAccessCollection, CustomStringConvertible, ThreadConfined where Element : RealmCollectionValue
-
CollectionElementMapper
将实际的collection对象转换为ProjectedCollection
。例如:
class Person: Object { @Persisted var dogs: List<Dog> } class PersonProjection: Projection<Person> { @Projected(\Person.dogs.projectTo.name) var dogNames: ProjectedCollection<String> }
在此代码中,
Person
的犬列表将通过projectTo
投影到犬名称列表声明
Swift
@dynamicMemberLookup public struct CollectionElementMapper<Element> where Element : RLMObjectBase, Element : RealmCollectionValue
-
Schema
实例表示由 Realm 托管的对象模式的collection。使用 Realm 时,
Schema
实例允许执行迁移和内省数据库模式。模式映射到核心数据库中的collection。
查看更多声明
Swift
@frozen public struct Schema : CustomStringConvertible
extension Schema: Equatable
-
查看更多SectionedResults
实例的迭代器。声明
Swift
@frozen public struct SectionedResultsIterator<Key, Element> : IteratorProtocol where Key : _Persistable, Key : Hashable, Element : RealmCollectionValue
-
查看更多Section
实例的迭代器。声明
Swift
@frozen public struct SectionIterator<Element> : IteratorProtocol where Element : RealmCollectionValue
-
查看更多SortDescriptor
存储键路径和排序顺序以与sorted(sortDescriptors:)
一起使用。 它与NSSortDescriptor
类似,但仅支持可由 Realm 查询引擎高效运行的功能子集。声明
Swift
@frozen public struct SortDescriptor
extension SortDescriptor: CustomStringConvertible
extension SortDescriptor: Equatable
extension SortDescriptor: ExpressibleByStringLiteral
-
封装 Realm 通知的订阅。
查看更多声明
Swift
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) @frozen public struct ObservationSubscription : Subscription
-
封装 Realm AsyncOpenTask 的订阅。
查看更多声明
Swift
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) @frozen public struct AsyncOpenSubscription : Subscription
-
Realm 事件记录可用于记录在 Realm 上执行的所有读取和写入,并将它们报告给服务器。 通过设置用于打开 Realm 的
查看更多Realm.Configuration
的eventConfiguration
属性来启用事件记录,然后在Realm
上使用events
属性获取Events
实例。声明
Swift
public struct Events
-
Realm 事件记录的配置参数。
通过将
Realm.Configuration.eventConfiguration
设置为任何非零的EventConfiguration
来启用 Realm 事件记录。 默认初始化的配置是有效的,但某些属性可能需要自定义。使用 Realm 事件记录需要在您将向其写入事件的应用的服务器上定义的模式中包含集合
AuditEvent
。 模式必须包含以下字段:_id
:ObjectId
activity
:String
event
:String?
data
:String?
timestamp
:Date
String?
此外,每个使用的元数据键都必须有一个字段。
声明
Swift
@frozen public struct EventConfiguration : Sendable
-
保存元素在 Map 中的偏移量的容器类型。
查看更多声明
Swift
public struct MapIndex
-
用于在 Map 中保存单个键值条目的container。这用于元组无法表示为通用参数的情况。
查看更多声明
Swift
public struct SingleMapEntry<Key, Value> : _RealmMapValue, Hashable where Key : _MapKey, Value : RealmCollectionValue
-
声明
Swift
@frozen public struct PropertyChange
-
声明
Swift
@frozen public struct ObjectSchema : CustomStringConvertible
extension ObjectSchema: Equatable
-
@Persisted 用于声明应由 Realm 托管的对象子类的属性。
使用示例:
class MyModel: Object { // A basic property declaration. A property with no // default value supplied will default to `nil` for // Optional types, zero for numeric types, false for Bool, // an empty string/data, and a new random value for UUID // and ObjectID. @Persisted var basicIntProperty: Int // Custom default values can be specified with the // standard Swift syntax @Persisted var intWithCustomDefault: Int = 5 // Properties can be indexed by passing `indexed: true` // to the initializer. @Persisted(indexed: true) var indexedString: String // Properties can set as the class's primary key by // passing `primaryKey: true` to the initializer @Persisted(primaryKey: true) var _id: ObjectId // List and set properties should always be declared // with `: List` rather than `= List()` @Persisted var listProperty: List<Int> @Persisted var setProperty: MutableSet<MyObject> // LinkingObjects properties require setting the source // object link property name in the initializer @Persisted(originProperty: "outgoingLink") var incomingLinks: LinkingObjects<OtherModel> // Properties which are not marked with @Persisted will // be ignored entirely by Realm. var ignoredProperty = true }
可以通过将
indexed: true
传递给初始化器来对 Int、Bool、String、ObjectId 和 Date 属性进行索引。 对属性进行索引可提高对该属性进行相等查询的性能,但写入性能会稍差。 当前没有其他操作使用该索引。通过将
primaryKey: true
传递给初始化器,可以将属性设置为类的主键。 不支持复合主键,将多个属性设置为主键会在运行时引发异常。 只有 Int、String、UUID 和 ObjectID 属性可以作为主键,并且在使用 Atlas App Services 时,主键必须命名为_id
。 主键属性只能在非托管对象上进行更改,在已添加到 Realm 的对象上进行更改会引发异常。可以选择使用标准 Swift 语法为属性指定默认值。 如果未给出默认值,则在首次访问时生成一个值:对于所有可选类型,为
nil
;对于数字类型为零;对于 Bool 为 false;为空字符串/数据;为 UUID 和 ObjectID 生成一个新的随机值。 List 和 MutableSet 属性不应通过将其设置为空 List/MutableSet 的默认值来定义。 这样做是可行的,但会导致访问 Realm 托管的对象时性能下降。同样,ObjectID 属性不应初始化为ObjectID.generate()
,因为这样做会导致生成额外的 ObjectID,然后在读取 Realm 时将其丢弃。如果一个类至少有一个 @Persisted 属性,则 Realm 将忽略所有其他属性。 这意味着它们不会持久保存,也无法用于查询和其他需要托管属性的操作,例如排序和聚合。
@Persisted 不能用在任何地方,只能用作 对象 或 EmbeddedObject 子类上的 属性,并且尝试在其他地方使用它会导致运行时错误。
查看更多声明
Swift
@propertyWrapper public struct Persisted<Value> where Value : _Persistable
extension Persisted: Decodable where Value: Decodable
extension Persisted: Encodable where Value: Encodable
extension Persisted: OptionalCodingWrapper where Value: ExpressibleByNilLiteral
-
@Projected
用于声明Projection
协议上应由 Realm 托管的属性。使用示例:
查看更多public class Person: Object { @Persisted var firstName = "" @Persisted var lastName = "" @Persisted var address: Address? @Persisted var friends: List<Person> @Persisted var reviews: List<String> } class PersonProjection: Projection<Person> { @Projected(\Person.firstName) var firstName @Projected(\Person.lastName.localizedUppercase) var lastNameCaps @Projected(\Person.address.city) var homeCity @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection<String> } let people: Results<PersonProjection> = realm.objects(PersonProjection.self)
声明
Swift
@propertyWrapper public struct Projected<T, Value> : AnyProjected where T : RLMObjectBase
-
声明
Swift
@frozen public struct ProjectedPropertyChange
-
Property
实例表示由对象模式上下文中的 Realm 托管的属性。此类属性可能会持久保存在 Realm 文件中,也可能会根据 Realm 中的其他数据进行计算。使用 Realm 时,属性实例允许执行迁移和内省数据库模式。
属性实例映射到核心数据库中的列。
查看更多声明
Swift
@frozen public struct Property : CustomStringConvertible
extension Property: Equatable
-
表示
查看更多String
查询选项的枚举。声明
Swift
public struct StringOptions : OptionSet, Sendable
-
Query
是用于创建类型安全查询谓词的类。使用
Query
,您具有创建 Swift 风格的查询表达式的能力,然后将其构造到NSPredicate
中。Query
类不应直接实例化,而应仅用作将查询表达式作为参数的闭包中的参数。 示例:public func where(_ query: ((Query<Element>) -> Query<Element>)) -> Results<Element>
然后,您可以像这样使用上述函数:
let results = realm.objects(Person.self).query { $0.name == "Foo" || $0.name == "Bar" && $0.age >= 21 }
支持的谓词类型
Prefix
- not
!
swift let results = realm.objects(Person.self).query { !$0.dogsName.contains("Fido") || !$0.name.contains("Foo") }
比较
- Equals
==
- 不等于
!=
- 大于
>
- 小于
<
- GreaterThanOrEqual
>=
- LessThanOrEqual
<=
- between
.contains(_ range:)
集合
- 登录
.contains(_ element:)
- between
.contains(_ range:)
Map
- @allKeys
.keys
- @allValues
.values
多个子句
- 和
&&
- 或
||
collection聚合
- @avg
.avg
- @min
.min
- @max
.max
- @sum
.sum
- @count
.count
swift let results = realm.objects(Person.self).query { !$0.dogs.age.avg >= 0 || !$0.dogsAgesArray.avg >= 0 }
其他
- not
!
- subquery
($0.fooList.intCol >= 5).count > n
声明
Swift
@dynamicMemberLookup public struct Query<T>
- not
-
查看更多RealmCollection
实例的迭代器。声明
Swift
@frozen public struct RLMIterator<Element> : IteratorProtocol where Element : RealmCollectionValue
-
查看更多RealmKeyedCollection
实例的迭代器。声明
Swift
@frozen public struct RLMMapIterator<Element> : IteratorProtocol where Element : _RealmMapValue
-
查看更多Map<Key, Value>
的迭代器,可为映射中的每个条目生成(key: Key, value: Value)
对。声明
Swift
@frozen public struct RLMKeyValueIterator<Key, Value> : IteratorProtocol where Key : _MapKey, Value : RealmCollectionValue
-
用于实例化可观察对象的属性包装器类型。
通过将
@StateRealmObject
属性应用于属性声明并提供符合doc://com.apple.documentation/documentation的初始值,在SwiftUI/View
、SwiftUI/App
或SwiftUI/Scene
中创建状态 Realm 对象/Combine/ObservableObject 协议:@StateRealmObject var model = DataModel()
SwiftUI 仅为声明该对象的结构体的每个实例创建该对象的新实例一次。 当可观察的 Realm 对象的已发布属性发生变化时,SwiftUI 会更新任何视图中依赖于这些属性的部分。如果非托管,则将从对象本身读取属性,否则将从底层 Realm 读取。 对该值的更改将异步更新视图:
Text(model.title) // Updates the view any time `title` changes.
您可以将状态对象传递给具有
SwiftUI/ObservedRealmObject
属性的属性。使用
$
操作符获取状态对象属性之一的SwiftUI/Binding
。 如果要创建与对象属性之一的双向连接,请使用绑定。 例如,您可以让SwiftUI/Toggle
控制存储在模型中名为isEnabled
的布尔值:Toggle("Enabled", isOn: $model.isEnabled)
这会将修改后的
查看更多isEnabled
属性写入model
对象的 Realm。声明
Swift
@available(iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0, *) @MainActor @propertyWrapper public struct StateRealmObject<T> : DynamicProperty where T : RealmSubscribable, T : ThreadConfined, T : Equatable
-
一种属性包装器类型,表示对 Realm 进行查询的结果。
结果使用环境值
realmConfiguration
提供的 域 配置。与非 SwiftUI 结果collection不同,ObservedResults 是可变的。写入 ObservedResults collection 会隐式执行写事务(write transaction)。如果将对象添加到 ObservedResults 中,关联查询会过滤掉该对象,则该对象会添加到域中,但不会包含在 ObservedResults 中。
对于 SwiftUI 中的
查看更多@ObservedResults var v
,$v
指的是BoundCollection
。声明
Swift
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) @propertyWrapper @MainActor public struct ObservedResults<ResultType> : DynamicProperty, BoundCollection where ResultType : KeypathSortable, ResultType : RealmFetchable, ResultType : _ObservedResultsValue, ResultType : Identifiable
-
表示分段结果集合的属性包装器类型。
如果初始化程序中未设置
configuration
,则分段结果将使用环境值realmConfiguration
提供的域配置。对于 SwiftUI 中的
查看更多@ObservedSectionedResults var v
,$v
指的是BoundCollection
。声明
Swift
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) @propertyWrapper @MainActor public struct ObservedSectionedResults<Key, ResultType> : DynamicProperty, BoundCollection where Key : _Persistable, Key : Hashable, ResultType : KeypathSortable, ResultType : RealmFetchable, ResultType : _ObservedResultsValue, ResultType : Identifiable
-
声明
Swift
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) @MainActor @propertyWrapper public struct ObservedRealmObject<ObjectType>: DynamicProperty where ObjectType: RealmSubscribable & ThreadConfined & ObservableObject & Equatable
-
一种属性包装器类型,用于为当前用户启动异步打开 Realm 的
Realm.asyncOpen()
,并通知给定进程的状态在用户已经登录后或用户将要登录时,将 AsyncOpen 添加到
SwiftUI/View
或SwiftUI/App
@AsyncOpen(appId: "app_id", partitionValue: <partition_value>) var asyncOpen
这将立即启动
Realm.asyncOpen()
操作,该操作将执行使 Realm 进入可用状态所需的所有工作。 (请参阅 Realm.asyncOpen() 文档)此属性包装器将发布当前
Realm.asyncOpen()
进程的状态,如进度、错误和打开的域,这些状态可用于更新视图struct AsyncOpenView: View { @AsyncOpen(appId: "app_id", partitionValue: <partition_value>) var asyncOpen var body: some View { switch asyncOpen { case .notOpen: ProgressView() case .open(let realm): ListView() .environment(\.realm, realm) case .error(_): ErrorView() case .progress(let progress): ProgressView(progress) } } }
这个打开的
realm
稍后可以作为环境值注入到视图中,我们的属性包装器将使用该值将打开的域中的数据填充到视图中
查看更多ListView() .environment(\.realm, realm)
声明
Swift
@available(iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0, *) @MainActor @propertyWrapper public struct AsyncOpen : DynamicProperty
-
AutoOpen
将尝试一次异步打开 Realm,但在没有互联网连接的情况下,将为给定的 appId 和 partitionValue 返回一个打开的 Realm,可以在我们的视图中使用。在用户已经登录后或用户即将登录时,将 AutoOpen 添加到SwiftUI/View
或SwiftUI/App
@AutoOpen(appId: "app_id", partitionValue: <partition_value>, timeout: 4000) var autoOpen
这将立即启动
Realm.asyncOpen()
操作,该操作将执行使 Realm 进入可用状态所需的所有工作。 (请参阅 Realm.asyncOpen() 文档)此属性包装器将发布当前
Realm.asyncOpen()
进程的状态,如进度、错误和打开的域,这些状态可用于更新视图struct AutoOpenView: View { @AutoOpen(appId: "app_id", partitionValue: <partition_value>) var autoOpen var body: some View { switch autoOpen { case .notOpen: ProgressView() case .open(let realm): ListView() .environment(\.realm, realm) case .error(_): ErrorView() case .progress(let progress): ProgressView(progress) } } }
这个打开的
realm
稍后可以作为环境值注入到视图中,我们的属性包装器将使用该值将打开的域中的数据填充到视图中ListView() .environment(\.realm, realm)
此属性包装器的行为与
查看更多AsyncOpen
类似,在声明和使用术语方面完全相同,但区别在于采用的是离线优先方法。声明
Swift
@available(iOS 14.0, macOS 11.0, tvOS 14.0, watchOS 7.0, *) @MainActor @propertyWrapper public struct AutoOpen : DynamicProperty
-
查看更多SyncConfiguration
表示旨在与 Atlas App Services 同步的 Realm 的配置参数。声明
Swift
@frozen public struct SyncConfiguration : Sendable
-
提供接口的结构,以便使用提供的名称和参数调用 Atlas App Services 函数。
user.functions.sum([1, 2, 3, 4, 5]) { sum, error in guard case let .int64(value) = sum else { print(error?.localizedDescription) } assert(value == 15) }
动态成员名称(上例中为
查看更多sum
)与函数名称直接关联。 第一个参数是要提供给函数的BSONArray
参数。 第二个也是最后一个参数是函数调用完成时要调用的完成处理程序。 此处理程序在非主全局DispatchQueue
上执行。声明
Swift
@dynamicMemberLookup @frozen public struct Functions : Sendable
-
为用户函数启用以下语法糖的结构:
guard case let .int32(sum) = try await user.functions.sum([1, 2, 3, 4, 5]) else { return }
动态成员名称(上例中为
查看更多sum
)由与函数名称直接关联的@dynamicMemberLookup
提供。声明
Swift
@dynamicCallable public struct FunctionCallable : Sendable
-
查看更多SyncSubscription
用于定义通过查询订阅集获得的Flexible Sync订阅,可用于读取或删除/更新已提交的订阅。声明
Swift
@frozen public struct SyncSubscription
-
查看更多SubscriptionQuery
用于定义命名/未命名查询订阅查询,可在写订阅事务中添加/删除或更新该查询。声明
Swift
@frozen public struct QuerySubscription<T> where T : RealmSwiftObject
-
查看更多SyncSubscriptionSet
是SyncSubscription
的集合。 这是添加和删除SyncSubscription
的入口点。声明
Swift
@frozen public struct SyncSubscriptionSet
extension SyncSubscriptionSet: Sequence
-
此结构体为
查看更多SyncSubscriptionSet
启用序列式枚举。声明
Swift
@frozen public struct SyncSubscriptionSetIterator : IteratorProtocol
-
要在线程之间传递的对象,其中包含对其线程限制对象的线程安全引用。
要在不同线程上解析目标 Realm 的线程安全引用,请传递给
Realm.resolve(_:)
。警告
ThreadSafeReference
对象最多必须解析一次。 无法解析ThreadSafeReference
将导致 Realm 的源版本被固定,直到引用被解除分配。注意
首选短期
ThreadSafeReference
,因为源 Realm 版本的数据将保留,直到所有引用都已解析或解除分配。声明
Swift
@frozen public struct ThreadSafeReference<Confined> where Confined : ThreadConfined
extension ThreadSafeReference: Sendable