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.

有关详细信息,请参阅