【问题标题】:How to call a generic method from a non generic method without completion handler in swift如何在没有完成处理程序的情况下快速从非泛型方法调用泛型方法
【发布时间】:2020-03-20 01:44:27
【问题描述】:

我有这个具有完成处理程序的 getData 通用网络调用:

func getData<K: Codable>(dataType : DataType, result: (Result<[K]>) -> Void) {
    networkManager.request(route: dataType) { (results:Result<[K]>) in
        switch results {
        case .success:
            switch dataType {
            case .users: self.networkDelegate.didLoadUserData()
            case .albums: self.networkDelegate.didLoadAlbumsData()
            case .comments: self.networkDelegate.didLoadCommentsData()
            case .photos: self.networkDelegate.didLoadPhotosData()
            case .posts: self.networkDelegate.didLoadPostData()
            case .todos: self.networkDelegate.didLoadTodosData()
            }
        case .error(let error): self.networkDelegate.onError(error: error)
        }
    }
}

这是对该方法的调用:

router.getData(dataType: DataType.albums) { (result:Result<[PostModel]>) in
            //receives results but there is nothing to handle as the data is being sent via delegates
        }

我不想在 router.getData() 中有一个完成处理程序,因为我想使用委托来通知我的控制器有关数据的下载状态。

所以我做了同样的方法(getData),但没有完成处理程序,签名看起来像这样:

func getData<K:Codable>(dataType : DataType, result: Result<[K]>) {
        networkManager.request(route: dataType) { (results:Result<[K]>) in
            //here the delegates would call back my controller with the data 
        }
    }

唯一的区别是现在可以在没有任何完成处理程序块的情况下完成调用,所以现在理想情况下我应该可以这样调用它:

router.callToData(dataType: DataType.albums, result: (Result<[PostModel]>))

但我有一个错误:

Cannot convert value of type '(Result<[PostModel]>).Type' to expected argument type 'Result<[_]>'

我正在尝试一切,但我找不到解决方案。有人可以帮忙吗?

【问题讨论】:

    标签: ios swift generics swift3


    【解决方案1】:
    func getData<K:Codable>(dataType : DataType, result: Result<[K]>) {}
    

    这表示你必须传递一个Result&lt;[K]&gt; 类型的,但你想传递Result&lt;[K]&gt;类型,应该是这样的:

    func getData<K: Codable>(dataType : DataType, result: Result<[K]>.Type) {}
                                                                     ^^^^^
    

    它会这样称呼:

    getData(dataType: DataType.albums, result: Result<[PostModel]>.self)
                                                                  ^^^^^
    

    但我不建议这样做。传递K 本身,这会变得更简单:

    func getData<K: Codable>(dataType : DataType, result: K.Type) {}
                                                          ^^^^^^
    getData(dataType: DataType.albums, result: PostModel.self)
                                               ^^^^^^^^^^^^^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多