【发布时间】: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)
}
LiveData 和 LiveObject 是 Realms 类型的类型别名或扩展:
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的别名。