Swift 泛型问题:无法推断泛型参数
Swift generics issue: generic parameter could not be inferred
使用此代码:
public protocol LoginInfoBase: Decodable {
var access_token: String? { get }
var notifications: [PushNotification] { get }
}
public class ExampleLoginInfo: LoginInfoBase {
public var access_token: String? = nil
public var notifications: [PushNotification] = []
public var user_info: UserInfo? = nil
public var more_example_data: String? = nil
}
public func genericQuery<T: Decodable>(urlString: String, method: QueryType, params: Parameters?, decodable: T.Type,completionHandler: @escaping (Swift.Result<T, Error>) -> Void) {
<more code here>
}
}
public func getLoginInfo(loginInfoClass: LoginInfoBase.Type, completionHandler: @escaping (Swift.Result<LoginInfoBase, Error>) -> Void) {
genericQuery(urlString: "\(baseURL)/users/get_login_info/", method: .get, params: nil, decodable: loginInfoClass.self) { result in
<more code here>
}
}
然后我打电话给getLoginInfo
...
getLoginInfo(loginInfoClass: ExampleLoginInfo.self) { result in
<more code here>
}
...并出现此错误:
Generic parameter 'T' could not be inferred
Cannot convert value of type 'LoginInfoBase.Type' to expected argument type 'T.Type'
这是背景。我正在尝试设置一个通用登录库,可以使用 class 调用,其中包含特定于每个应用程序的用户数据。在这个应用程序中,我子 class LoginInfoBase
作为 ExampleLoginInfo
添加额外的用户数据。我的意图是库将从服务器返回的用户数据解码为 ExampleLoginInfo。
有任何解决错误的想法吗?
这是错误的签名:
public func getLoginInfo(loginInfoClass: LoginInfoBase.Type, completionHandler: @escaping (Swift.Result<LoginInfoBase, Error>) -> Void)
你的意思是:
public func getLoginInfo<T: LoginInfoBase>(loginInfoClass: T.Type, completionHandler: @escaping (Swift.Result<LoginInfoBase, Error>) -> Void)
^^^^^^^^^^^^^^^^^^ ^
您需要将符合 LoginInfoBase 的 具体 类型传递给 getLoginInfo
。不只是任何亚型。这符合您的 genericQuery
方法。
然后您应该将对 genericQuery 的调用修改为:
genericQuery(urlString: "\(baseURL)/users/get_login_info/",
method: .get,
params: nil,
decodable: T.self) { ... } // use T.self here.
有关详细信息,请参阅 。
使用此代码:
public protocol LoginInfoBase: Decodable {
var access_token: String? { get }
var notifications: [PushNotification] { get }
}
public class ExampleLoginInfo: LoginInfoBase {
public var access_token: String? = nil
public var notifications: [PushNotification] = []
public var user_info: UserInfo? = nil
public var more_example_data: String? = nil
}
public func genericQuery<T: Decodable>(urlString: String, method: QueryType, params: Parameters?, decodable: T.Type,completionHandler: @escaping (Swift.Result<T, Error>) -> Void) {
<more code here>
}
}
public func getLoginInfo(loginInfoClass: LoginInfoBase.Type, completionHandler: @escaping (Swift.Result<LoginInfoBase, Error>) -> Void) {
genericQuery(urlString: "\(baseURL)/users/get_login_info/", method: .get, params: nil, decodable: loginInfoClass.self) { result in
<more code here>
}
}
然后我打电话给getLoginInfo
...
getLoginInfo(loginInfoClass: ExampleLoginInfo.self) { result in
<more code here>
}
...并出现此错误:
Generic parameter 'T' could not be inferred
Cannot convert value of type 'LoginInfoBase.Type' to expected argument type 'T.Type'
这是背景。我正在尝试设置一个通用登录库,可以使用 class 调用,其中包含特定于每个应用程序的用户数据。在这个应用程序中,我子 class LoginInfoBase
作为 ExampleLoginInfo
添加额外的用户数据。我的意图是库将从服务器返回的用户数据解码为 ExampleLoginInfo。
有任何解决错误的想法吗?
这是错误的签名:
public func getLoginInfo(loginInfoClass: LoginInfoBase.Type, completionHandler: @escaping (Swift.Result<LoginInfoBase, Error>) -> Void)
你的意思是:
public func getLoginInfo<T: LoginInfoBase>(loginInfoClass: T.Type, completionHandler: @escaping (Swift.Result<LoginInfoBase, Error>) -> Void)
^^^^^^^^^^^^^^^^^^ ^
您需要将符合 LoginInfoBase 的 具体 类型传递给 getLoginInfo
。不只是任何亚型。这符合您的 genericQuery
方法。
然后您应该将对 genericQuery 的调用修改为:
genericQuery(urlString: "\(baseURL)/users/get_login_info/",
method: .get,
params: nil,
decodable: T.self) { ... } // use T.self here.
有关详细信息,请参阅