PromiseKit не может вызвать «выполнить» со списком аргументов типа «(Данные)»

#ios #swift #nsurlsession #nsurlrequest #promisekit

#iOS #swift #nsurlsession #nsurlrequest #promisekit

Вопрос:

Я пытаюсь получить данные из сетевого запроса, используя PromiseKit в следующем коде ниже, но в строке seal.fulfill(data) я получаю сообщение об ошибке «Невозможно вызвать «выполнить» со списком аргументов типа «(Данные)». Может кто-нибудь, пожалуйста, дать мне подсказку о том, что я делаю не так?

 import Foundation
import PromiseKit

class NetworkService {
    
    let baseHost: String = "api.someAwesomeSite.com"
    var version: String { return "3.345" }
    let configuration = URLSessionConfiguration.default
    
    func getData<Data>(method: String, queryItems: [URLQueryItem] = []) -> Promise<Data> {
        var urlConstructor = URLComponents()
        urlConstructor.scheme = "https"
        urlConstructor.host = self.baseHost
        urlConstructor.path = "/method/(method)"
        
        urlConstructor.queryItems = [
            URLQueryItem(name: "user_id", value: ApiManager.session.userId),
            URLQueryItem(name: "access_token", value: ApiManager.session.token),
            URLQueryItem(name: "v", value: version),
        ]
        
        urlConstructor.queryItems?.append(contentsOf: queryItems)
        
        let request = URLRequest(url: urlConstructor.url!)
        let session = URLSession(configuration: configuration)
        
        return Promise<Data> { seal in
            let task = session.dataTask(with: request) { (data, response, apiError) in
                
                if let error = apiError {
                    seal.reject(error)
                }
                
                if let data = data {
                    seal.fulfill(data)
                }
                }
            task.resume()
        }
    }

 

Ответ №1:

Я думаю, вы просто немного смущены своими общими аргументами. Изменить:

     func getData<Data>(method: String, queryItems: [URLQueryItem] = []) -> Promise<Data> {
   
 

Для

     func getData(method: String, queryItems: [URLQueryItem] = []) -> Promise<Data> {
 

Проблема заключалась в том, что когда у вас есть Data аргумент общего типа, компилятор считает Data , что это какой-то тип, который вы определите… но внутри функции, которую вы также используете Data для ссылки на Data тип библиотеки Swift, и это не может быть обе вещи одновременно.