0

我正在尝试创建一个可以执行函数的完成块,但我不断收到错误消息:

无法将类型“()”的值转换为预期的参数类型“()-> Void”

这是功能:

var labelViews : [LabelViews] = []

private func removeAllLabels(completion: (() -> Void)) {
    guard let mapController = viewModel.mapController,
        let currentMap = mapController.currentMap else {
            return
    }

    LabelViews.forEach { view in
        DispatchQueue.main.async {
            mapController.removeComponent(view, on: currentMap)
        }  
    }
    completion()
}

但是当我尝试使用它时,我得到了错误:

self.removeAllCampusLabels(completion: self.labelViews.removeAll()) // error happens here
4

3 回答 3

1

您需要指定在多个完成情况下会发生什么:

var labelViews : [LabelViews] = []



  private func removeAllLabels(completion: nil) {
                guard let mapController = viewModel.mapController,
                    let currentMap = mapController.currentMap else {
                        return
                }

                LabelViews.forEach { view in
                    DispatchQueue.main.async {
                        mapController.removeComponent(view, on: currentMap)}  
    }
                func comp(completion: () -> Void) {
                print("Success")
                completion()
          }

   }
于 2020-05-20T23:06:48.607 回答
0

Assuming removeAllLabels and removeAllCampusLabels are the same methods (ignoring typo), replace the method call

self.removeAllCampusLabels(completion: self.labelViews.removeAll())

with

self.removeAllCampusLabels { self.labelViews.removeAll() }
于 2020-05-21T05:30:22.760 回答
-1

您的问题定义了一个名为 的函数removeAllLabels,但是您说调用时会发生错误removeAllCampusLabels,而您的问题没有定义。如果您检查您在问题中输入的代码是否足以重现您所询问的错误,您将获得更好的帮助。

我假设你的函数实际上是命名的removeAllLabels

这是您的声明removeAllLabels

private func removeAllLabels(completion: (() -> Void))

这是一个接受一个参数的函数,称为completion. 该参数必须具有 type () -> Void,这意味着参数本身必须是一个不带参数且不返回任何内容的函数。

以下是(我假设)您尝试调用的方式removeAllLabels

self.removeAllLabels(completion: self.labelViews.removeAll())

让我们分解一下:

let arg = self.labelViews.removeAll()
self. removeAllLabels(completion: arg)

是什么类型的arg?我们需要它() -> Void。但是如果我们在 Xcode 中单击它,我们会看到它arg有类型()(与 相同Void)。事实上,Swift 会为它发出警告:

推断常量 'arg' 具有类型 '()',这可能是意料之外的

您可能打算做的是将removeAll调用包装在一个闭包中,如下所示:

let arg = { self.labelViews.removeAll() }
self.removeAllLabels(completion: arg)

一旦你消除了错误,你可以将它重新组合在一个语句中:

self.removeAllLabels(completion: { self.labelViews.removeAll() })
于 2020-05-20T23:27:19.993 回答