【问题标题】:Swift Generic CallbackSwift 通用回调
【发布时间】:2019-03-12 07:24:40
【问题描述】:

我目前正在学习如何实现一个通用函数。我正在尝试创建一个返回泛型类型回调的函数

这是我的代码

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?
}

有人可以指导我了解我所缺少的吗?

谢谢

【问题讨论】:

  • 你怎么称呼那个方法?您在哪一行收到错误?你能用这些细节更新问题吗?
  • 为什么你认为你的方法应该是通用的?
  • 嗨@Cristik,Xcode 不会编译代码。编译器的错误如上所述。谢谢
  • @Sweeper,因为会有很多 API 调用会返回 DomainObjectWrapper。所以我想创建一个通用函数将帮助我避免冗余代码。谢谢

标签: ios swift generics


【解决方案1】:

因为会有很多 API 调用会返回 DomainObjectWrapper。所以我想创建一个通用函数将帮助我避免冗余代码。谢谢

如果是这种情况,那么您将在 Alamofire 调用的闭包参数中使用 DataResponse&lt;DomainObjectWrapper&lt;T&gt;&gt; 而不是 DataResponse&lt;DomainObjectWrapper&lt;MenuItemDO&gt;&gt;

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)
            }
     }
}

【讨论】:

  • 嗨清扫车。非常感谢你的回复。我在完成()代码上遇到错误。基本上我的 responseObject 是正确的。但是,不知何故,父回调函数无法识别我在 switch 案例(responseObject)中的完成块。希望你明白我的意思。谢谢
  • @Alvin 哦,我才意识到!为什么你的switch 没有cases?你遇到了什么错误?
  • 嗨,实际上是有的,我只是想保持我的代码简单,以便在这里进行解释:)。错误是我在我的问题中所说的错误:)。谢谢!
  • @Alvin 你有没有像我告诉你的那样把DataResponse&lt;DomainObjectWrapper&lt;MenuItemDO&gt;&gt; 改成DataResponse&lt;DomainObjectWrapper&lt;T&gt;&gt;?如果是这样,则不应出现错误消息。或者您的意思是您在调用performPOST 时遇到错误?
  • 我改了。但我无法获得我的 MenuItemDO 属性。我无法从 JSON 中获取数据。我只能获取 DomainEntity 属性。有什么解决方法吗?还是我的功能一开始就错了?我已经更新了我的其他类结构。请指导我。谢谢
【解决方案2】:

最近我为泛型参数函数做了一个好的解决方案。这是命令模式的示例。这样你就可以使用这个模式接收带有泛型参数的回调。

protocol ParameterCommand {
    func execute(with parameter: Any)
}

protocol CallbackCommand: ParameterCommand {
    associatedtype CallBackParameterType
    func execute(with callback: @escaping (CallBackParameterType) -> Void)
}

extension CallbackCommand {
    func execute(with parameter: Any) {
        if let parameter = parameter as? (CallBackParameterType) -> Void {
            execute(with: parameter)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2020-11-18
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多