我遇到了一个问题,就像标题所描述的那样:由于某种原因,guard语句破坏了类型推断。我已经创建了一个Playground项目来解决这个问题。
下面是一些用于设置的样板代码:
import Foundation
struct Model: Decodable {
var i: String
}
let jsonString = """
{
"i": "yes"
}
"""
let jsonData = jsonString.data(using: .utf8)
let theModel = try JSONDecoder().decode(Model.self, from: jsonData!)
struct Response<T> {
var decodedData: T?
}
enum Result<Value> {
case success(Value)
case failure
}
struct Client {
static let shared = Client()
private init() {}
func execute<T: Decodable>(completion: (Response<T>) -> ()) {
let decodedData = try! JSONDecoder().decode(T.self, from: jsonData!)
completion(Response(decodedData: decodedData))
}
}以下是问题所在:
struct ServicesA {
func loadSomething(completion: (Result<Model>) -> ()) {
Client.shared.execute { result in // error: generic parameter 'T' could not be inferred
guard let decodedData = result.decodedData else { return }
completion(Result.success(decodedData))
}
}
}
struct ServicesB {
func loadSomething(completion: (Result<Model>) -> ()) {
Client.shared.execute { result in
completion(Result.success(result.decodedData!))
}
}
}ServicesA会中断,而ServicesB会编译。
正如您所看到的,唯一的区别是guard let decodedData = result.decodedData else { return }。它破坏了类型推断,因此Client.shared.execute函数会报告无法推断出T。
我想知道为什么会发生这种情况,以及处理这个问题最合适的方法是什么。
https://stackoverflow.com/questions/50625011
复制相似问题