Swift Generic Callback - PullRequest
       6

Swift Generic Callback

0 голосов
/ 12 марта 2019

В настоящее время я учусь тому, как реализовать универсальную функцию. Я пытаюсь создать функцию, которая будет возвращать обратный вызов с универсальным типом

Вот мой код

static func performPOST<T: DomainEntity>(action: Module, completion: @escaping (CallbackResponse, DomainObjectWrapper<T>?) -> Void) {

     //logic implementation at first

     switch action { 
          case .getMenuItem:
          self.alamofireManager.request(urlRequest, encoding: URLEncoding.default, headers: headers).responseObject { (response: DataResponse<DomainObjectWrapper<MenuItemDO>>) in
                var validateRequestResponse = RestHelper.validateRequestResponse(response: response)
                let responseObject = validateRequestResponse.responseObject

                if validateRequestResponse.isSuccess {}
                else {
                    if let errorMessage = responseObject?.error {
                        validateRequestResponse.message = errorMessage
                    }
                    else if let warningMessage = responseObject?.warning {
                        validateRequestResponse.message = warningMessage
                    }
                }
                callbackResponse = RestHelper.bindValidateRequestResponse(validateRequestResponse: validateRequestResponse)
                completion(callbackResponse, responseObject)
            }
          case .makeSales: break
          case .attendance: break
     }
}

Я получаю эту ошибку от Xcode. Это не позволит мне скомпилировать.

completion(callbackResponse, responseObject) <<-- This Line

Cannot convert value of type 'DomainObjectWrapper<MenuItemDO>?' to expected argument type 'DomainObjectWrapper<_>?'

Вот мои другие занятия

public class DomainObjectWrapper<T: Mappable>: Mappable {
     public var data = [T]()
}

public class DomainEntity: Mappable {
     public var id = UUID().uuidString
     public var isDeleted = false
}

public class MenuItemDO: DomainEntity {
     public var categoryId: String?
     public var categoryName: String?
}

Кто-нибудь может подсказать мне, что мне не хватает?

Спасибо

1 Ответ

1 голос
/ 12 марта 2019

, потому что будет много вызовов API, которые возвратят DomainObjectWrapper.Поэтому я думаю, что создание универсальной функции поможет мне избежать избыточного кода.Спасибо

Если это так, то вы бы использовали DataResponse<DomainObjectWrapper<T>> вместо DataResponse<DomainObjectWrapper<MenuItemDO>> в параметре закрытия вызова Alamofire:

static func performPOST<T: DomainEntity>(action: Module, completion: @escaping (CallbackResponse, DomainObjectWrapper<T>?) -> Void) {

     //logic implementation at first

     switch action { 
          // this line
          self.alamofireManager.request(urlRequest, encoding: URLEncoding.default, headers: headers).responseObject { (response: DataResponse<DomainObjectWrapper<T>>) in // <----- this line
                var validateRequestResponse = RestHelper.validateRequestResponse(response: response)
                let responseObject = validateRequestResponse.responseObject

                if validateRequestResponse.isSuccess {}
                else {
                    if let errorMessage = responseObject?.error {
                        validateRequestResponse.message = errorMessage
                    }
                    else if let warningMessage = responseObject?.warning {
                        validateRequestResponse.message = warningMessage
                    }
                }
                callbackResponse = RestHelper.bindValidateRequestResponse(validateRequestResponse: validateRequestResponse)
                completion(callbackResponse, responseObject)
            }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...