swift 如何在没有完成处理程序的情况下从非泛型方法调用泛型方法

How to call a generic method from a non generic method without completion handler in swift

我有一个带有完成处理程序的 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<[_]>'

我什么都试过了,但找不到解决办法。有人可以帮忙吗?

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

这表示您必须传递 Result<[K]> 类型的 ,但您想传递 类型 Result<[K]>,就是这样:

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