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

Swift中带多参数的回调、完成处理程序

孙绍辉
2023-03-14

我在地图中的几个位置进行反向地理编码,并希望将其包装为某种常用方法。我所拥有的是作为工作起点的:

func reverseGeocodeLocation(location: CLLocation, completion: (CLPlacemark) -> Void) {
    let geocoder = CLGeocoder()

    geocoder.reverseGeocodeLocation(location) {
        (placemarks, error) -> Void in
        
        // Check for returned placemarks
        if let placemarks = placemarks where placemarks.count > 0 {
            let topResult = placemarks[0] as! CLPlacemark

            completion(topResult)
        }
    }
}

但是,如果我想在我的完成方法中添加另一个参数,将会向我的视图返回错误,如下所示:

func reverseGeocodeLocation(location: CLLocation, completion: (CLPlacemark, NSError) -> Void) {
    let geocoder = CLGeocoder()

    geocoder.reverseGeocodeLocation(location) {
        (placemarks, error) -> Void in
        
        // Check for returned placemarks
        if let placemarks = placemarks where placemarks.count > 0 {
            let topResult = placemarks[0] as! CLPlacemark

            completion(topResult, error)
        }
    }
}

如果error为nil,那么我的完成(topResult, error)将失败,因为错误为nil且访问错误。但我不能这样做,因为参数与完成处理程序不匹配。

if error != nil {
    completion(topResult)
} else {
    completion(...) // do something with the error
}

因此,如果我有一个nil错误,我将如何调用我的完成处理程序?

共有1个答案

苏志
2023-03-14

由于您拥有完成标头的定义,因此您可以使用可选的NSError?正常定义它,因此它不会导致错误并且需要展开。此外,CLGeocodeCompletionHandler的最新定义也使用了可选数组和错误:

typealias CLGeocodeCompletionHandler = ([CLPlacemark]?, NSError?) -> Void
 类似资料:
  • 我目前正在学习swift,几个小时以来我一直在试图理解一个错误。由于查询,我试图从php脚本中获取一个xml文件,我使用一个完成处理程序作为回调来获取这些查询的结果。 问题是我对这些技术感到不舒服,它说缺少论据。 下面是使用完成处理程序的函数: 这是我调用这个函数的一段代码: 这段代码显示有关调用连接的此错误: 我做错了什么?为什么它要两个参数? 非常感谢您的帮助。 埃尔巴托

  • 我基本上想有一个可选的完成处理器,没有参数被传递回来。这是我目前掌握的情况,但显然是错误的。 我不想在完成块中传递任何参数。我只想知道网络调用何时完成,以便刷新UI。我不想在这里刷新UI,因为我希望它充当刷新数据的通用函数。我之所以希望完成处理程序是可选的,是因为有时候刷新完成后我不需要做任何事情。 我也很困惑“逃离”是什么意思。当我做这样的事情时,我通常会有它,但任何清晰都会很好。我在网上做了一

  • 问题内容: 我在Utilities类中使用loadImage方法,并且在通过闭包返回图像时遇到了一些麻烦。基本上因为我的代码可能返回图像或错误,所以在调用该方法时将其分配给image属性是行不通的。 我在类的方法声明中使用的方法是否错误,还是应该以不同的方式调用该方法以预期潜在的不同结果?谢谢 问题答案: 将处理程序添加到您的 loadImage 函数中: 迅捷3 像这样调用func: 斯威夫特2

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

  • 问题内容: 我正在使用以下node.js代码从某些url下载文档并将其保存在磁盘中。我想知道何时下载该文档。我没有看到使用pipe进行任何回调。或者,下载完成后是否可以捕获任何“结束”事件? 问题答案: 流是,因此您可以听某些事件。如您所说,有一个请求事件(以前是)。 有关可用的事件的更多信息,请查看流文档页面。

  • 我正在制作一个显示化学反应动画的应用程序。每个原子都是一个SCNSphere,并用SCNActions动画。我试图使用runAction()中的完成处理程序在当前操作完成后调用下一个动画,因为每个原子必须进行许多不同的运动。 这只是我为简化过程而编写的一些测试代码,实际代码将在对象数组中循环。 语句工作正常,只有在操作完成后才会调用它,但是新的SCNAction不会触发。我是否遗漏了什么来启动下一