【问题标题】:'LiveData' requires that 'User' inherit from 'LiveObject'“LiveData”要求“用户”继承自“LiveObject”
【发布时间】:2021-04-01 18:14:26
【问题描述】:

我的项目使用 Swift 5.1,但我在使用一些 Swift 泛型运行单元测试时遇到了困难。

我有下面的代码和一些类型别名和函数:

final class User: LiveObject { //... }
func loadAllUsers(_ database: Database) -> LiveData<User> {
  database.objects(User.self)
}

数据库:

typealias Object = LiveObject
func objects<T>(_ type: T.Type) -> LiveData<T> where T: Object {
  realm.objects(type)
}

LiveDataLiveObjectRealms 类型的类型别名或扩展:

public typealias LiveData<T> = RealmSwift.Results<T> where T: LiveObject //[1. Requirement specified as 'T' : 'LiveObject' [with T = User]]
public typealias LiveList<T> = RealmSwift.List<T> where T: LiveObject

open class LiveObject: RealmSwift.Object { //... }

但是当调用下面的代码时:

let users: LiveData<User> = loadAllUsers(database)

我收到此错误:'LiveData' requires that 'User' inherit from 'LiveObject'

我真的不知道发生了什么,代码可以很好地编译主应用程序,只有在我运行 XCTest 时才会出现问题。上述所有函数也在主应用程序中调用。我不明白为什么编译器在运行 XCTest 时无法检测到 User inherits LiveObject`。

错误日志:

我认为这是重载函数和 objc 的问题。对吗?

编辑 1:从函数中删除类型可以解决大部分问题(但为什么?)。

谢谢!

【问题讨论】:

  • 这个typealias Object = LiveObject 可能是个问题,因为它看起来倒退了——不过我可能误解了它的目的。我相信一般结构是aliasName = existingObjectName。该代码告诉Object(这是一个现有的领域对象)它是LiveObject的别名。

标签: swift realm


【解决方案1】:

过去,当 Xcode 错误中引用的对象在框架和服务中都具有目标成员资格时,我遇到了类似的问题。实际上,该对象只需要框架中的目标成员身份,因为服务导入了框架。在导入另一个时同时拥有目标成员资格会创建循环引用并导致 Xcode 中的混乱错误。解决方案是删除不必要的目标成员。

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多