当前位置: 首页 > 知识库问答 >
问题:

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

屠盛
2023-03-14

我有这个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<[_]>'

我尝试了一切,但我找不到解决办法。有人能帮忙吗?

共有1个答案

太叔马鲁
2023-03-14
func getData<K:Codable>(dataType : DataType, result: Result<[K]>) {}

这意味着您必须传递<code>Result类型的值

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)
                                           ^^^^^^^^^^^^^^
 类似资料:
  • 问题内容: 我在Go中创建了Direct3D9包装器,该包装器使用CGo与C中的COM对象进行接口。 我想摆脱Windows下对C编译器的依赖,因此用户不必安装MinGW或Cygwin即可使用Go中的DirectX。 问题在于d3d9.dll不会公开C函数,而是使用COM。加载DLL(带有)后,可以直接调用的唯一函数是。这将返回一个COM对象,该对象将所有功能公开为方法。 如何在没有CGo的纯Go

  • 在过去的一周左右,我一直在绞尽脑汁,真的需要一些帮助。我的apk构建得很好,在linux上运行main.py工作得很好,然而,当在我的galaxy s6上运行apk时,它在打开后不久就崩溃了。我尝试更新buildozer,kivy,确保所有的依赖关系都得到满足,并包含在规范文件中(如下)。以及尝试无数其他解决方案,如更改api、更新所有构建工具等。 有人有什么想法吗?这里有一个到logcat的链接

  • 问题内容: 这是使用awt包的Java图形的初学者问题。我在网上找到了这段代码来绘制一些简单的图形。 在main方法中,在画布上没有调用paint()。但是我运行了该程序并且它可以工作,那么paint()方法如何运行? 问题答案: 该方法由事件调度线程(EDT)调用,并且基本上不受您的控制。 它的工作方式如下:当 实现 用户界面(以您的情况为例)时,Swing将启动EDT。然后,此EDT线程在后台

  • 我有一个问题要解决,我应该在哪里从使用Java8 streams的员工列表中找到性别为男性的第n个员工,如果没有找到,则返回可选的空。 下面是接受Employee对象列表和整数n的方法,其中n表示必须返回的第n个男性雇员(如果存在的话)。

  • 问题内容: 我是Swift和SpriteKit的新手。SpriteKit Actions的许多示例都在Objective C中,在Swift中我无法映射到它,也无法使用。 如果运行SKAction,并且在完成SKAction后又想做其他事情,那么如何在Swift中做到这一点呢? 任何想法将不胜感激。 编辑: 问题答案: 您的完成代码不会被调用,因为您的“死亡”操作将永远运行,这意味着它永远不会结束

  • 我想使用新的JSR-353(用于JSON处理的JavaAPI)与大家分享我的问题/答案。具体地说,您可以在两种不同的“API”中操作JSON数据:流和对象API。 如果你在谷歌上输入“jsr-353教程”,你会得到很多结果。 https://jcp.org/en/jsr/detail?id=353~具体请求的详细信息。 https://jsonp.java.net/~API的主站点,还将您链接到此