如何实例化 Realm Results<T> 数组

Posted

技术标签:

【中文标题】如何实例化 Realm Results<T> 数组【英文标题】:How to Instantiate a Realm Results<T> Array 【发布时间】:2017-04-03 16:37:46 【问题描述】:

Realm Swift 文档说查询 Results&lt;T&gt; 对象会返回一个数组,但是,当我尝试像这样实例化一个 Results 数组时:var allObjects : Results&lt;Object&gt; = [],我收到一条错误消息,说我不能将 Results 与数组字面量。

我知道 Realm API Reference 说“Results 实例不能直接实例化;”但我想知道是否有某种解决方法。

我想知道,因为我想要一个用空数组实例化的全局变量,并在 UIViewController 类的 viewWillAppear 方法中发生变异。例如:

var allItems : Results<Item> = [] 

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    let realm = try! Realm()
    self.allItems = realm.objects(Item.self).sorted(byKeyPath: "description")

【问题讨论】:

您能分享一下您想要执行此操作的用例吗?文档很清楚。 @dmorrow 我已经更新了我的答案。 一种情况是当谓词导致崩溃和疯狂时,您可能希望使用原始元素,然后将其转换回结果类型以进行观察。 【参考方案1】:

Results 是 Realm 提供的一个类型。尽管在外部它表现得像一个数组,但它实际上是一个包含 Realm 的延迟加载机制的抽象,它不会暴露给最终应用程序。因此,第三方应用无法创建 Results 的新实例。

如果您只想保留由 Realm 查询创建的 Results 实例,您可以将其设为可选,而不是尝试抢先实例化它。

var allItems: Results<Item>?

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    let realm = try! Realm()
    self.allItems = realm.objects(Item.self).sorted(byKeyPath: "description")

【讨论】:

【参考方案2】:

Results 泛型不是数组。它是可枚举和可下标的,但不是 CollectionType。

在这种情况下,您不会将allItems 设为可选然后解包吗?

【讨论】:

感谢您的意见。有没有办法实例化一个 Results 对象?

以上是关于如何实例化 Realm Results<T> 数组的主要内容,如果未能解决你的问题,请参考以下文章

给定 T 的字符串表示形式,如何实例化 SomeObject<T> 的实例?

LINQ如何返回IEnumerable 如果接口无法实例化? [重复]

C# 泛型类 构造方法中实例化T

C#从反射类型实例化通用列表[重复]

C#对泛型实例化对像的方法

.Net 4.0 中都有哪些实现 IQueryable<T> 的可实例化类型?