【问题标题】:Result type Generic parameter 'T' could not be inferred swift 5结果类型通用参数“T”无法快速推断 5
【发布时间】:2019-10-19 08:53:22
【问题描述】:

我试图了解我可以在协议中使用多少泛型。我的想法如下:

protocol Network {
    func fetchCodable<T:Codable>(urlRequest:URLRequest, completion:@escaping (Result<T,Error>)->Void)

}

然后我创建一个名为 AppNetwork 的类来实现网络协议。

extension AppNetwork:Network{
    func fetchCodable<T>(urlRequest: URLRequest, completion: @escaping (Result<T, Error>) -> Void) where T : Decodable, T : Encodable {

        URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in

            if let error = error {
                completion(.failure(error))
                return
            }

            guard let data = data else{
                completion(.failure(AppNetworkError.dataCorrupted))
                return
            }

            do {
                let response = try JSONDecoder().decode(T.self, from: data)
                completion(.success(response))
            }
            catch let decodeError{
                completion(.failure(decodeError))
            }

        }.resume()


    }

这个类是 NetworkHelper 的一部分,它实现了检索数据的功能,例如:

class NetworkHelper{
    let network:Network = AppNetwork()
}
...
//MARK:- Public methods
extension NetworkHelper{

    func getVenueDetails(inLocation:String, offset:Int, limit:Int, radius:Int = 1000,completion:(Result<VenueDetailsSearchResult, Error>)->Void){

        guard let foursquareConfig = foursquareConfig else{
            completion(.failure(NetworkHelper.NetworkHelperError.invalidFourSquareConfig))
            return
        }

        var venuesURLString = EndPoints.venueSearch.rawValue + "?"
        venuesURLString += foursquareConfig.getFormattedParams
        venuesURLString += "&near=\(inLocation)&radius=\(radius)&offset=\(offset)&limit=\(limit)"

        guard let venuesURL = URL(string: venuesURLString) else{
            completion(.failure(NetworkHelper.NetworkHelperError.invalidURL))
            return
        }

        let venuesURLRequest = URLRequest(url: venuesURL, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
        network.fetchCodable(urlRequest: venuesURLRequest) { result in



        }

    }

}

在这种情况下,我正在尝试获取结果,但我收到一条消息错误:“无法推断通用参数 'T'”

如果我能那样做,我该怎么做?

谢谢

【问题讨论】:

    标签: swift generics codable swift5


    【解决方案1】:

    你必须告诉编译器你期望的类型。

    network.fetchCodable(urlRequest: venuesURLRequest) { (_ result: Result<VenueDetailsSearchResult, Error>) in
        // ...
    }
    

    【讨论】:

    • 耶!它就是这样工作的!我知道我很接近了!谢谢
    • 只添加你只需要你的 T 可以解码,不需要编码
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多