我不确定为什么Swift无法将我显式传递的类型作为参数进行推断。
在下面的提取管理器上,尝试加载“实体”类型的对象时出现错误。
不能推断通用参数“实体”
class EventsViewController: UIViewController {
private let fetchManager = FetchManager()
override func viewDidLoad() {
super.viewDidLoad()
fetchManager.willPerformQuery = {}
// generic parameter 'Entity' could not be inferred
fetchManager.loadObjects(ofType: Event) { (outcome) in
switch outcome {
case .success(let events):
print("Entities: \(events.count)")
case .failure(let code):
switch code {
case .connectionUnavailable:
print("1")
case .notAuthenticated:
print("2")
case .retry:
print("3")
case .serviceUnavailable:
print("4")
case .unknown:
print("5")
}
}
}
}
}
class FetchManager {
private let database: ReadableDatabase = CloudKitDatabase()
var willPerformQuery: () -> Void = {}
func loadObjects<Entity: Queryable & CloudKitInitable>(ofType type: Entity, withCompletion completion: @escaping (FetchOutcome<Entity>) -> Void) {
database.loadObjects(matching: Entity.query, willPerformQuery: { [weak self] (_) in
self?.willPerformQuery()
}, didPerformQuery: { (outcome) in
switch outcome {
case .success(let files):
let entities: [Entity] = files.compactMap(Entity.init)
completion(FetchOutcome<Entity>.success(entities))
case .failure(let code):
completion(FetchOutcome<Entity>.failure(code))
}
})
}
}
最佳答案
引用类型本身(以访问其“元类型”)的语法为TypeName.self
。在这种情况下,您将使用Event.self
:
fetchManager.loadObjects(ofType: Event.self) { (outcome) in
^~~~~
方法签名也应该用
Entity.Type
更新,以便编译器可以告诉它想要类型information
而不是类型instance
:func loadObjects<Entity: Queryable & CloudKitInitable>(ofType type: Entity.Type, ...) {
...
}
关于swift - 无法推断通用参数“实体”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49854186/