Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@swift3中的转义闭包函数_Swift_Swift3_Escaping_Structure_Completionhandler - Fatal编程技术网

@swift3中的转义闭包函数

@swift3中的转义闭包函数,swift,swift3,escaping,structure,completionhandler,Swift,Swift3,Escaping,Structure,Completionhandler,以下函数出现错误关闭使用非转义参数“completion”可能允许其转义 func retrieveCannedRecommendedEntities() -> Future<CannedRecommendedEntities, NSError> { return Future() { completion in self.retrieve(.onboarding) { response in switch response { case .

以下函数出现错误
关闭使用非转义参数“completion”可能允许其转义

func retrieveCannedRecommendedEntities() -> Future<CannedRecommendedEntities, NSError> {
  return Future() { completion in
    self.retrieve(.onboarding) { response in
      switch response {
      case .success(let val):
        let payload: AnyObject = val.value.json! as AnyObject
        let json = JSON(payload)

        guard let suggestions = self.parseEntitiesFromJSON(json, atKey: "suggestion") else {
          completion(SqorResult.error(self.parsingError))
        }

        let teams = suggestions.filter {
          $0.entityType != .Player
        }

        let athletes = suggestions.filter {
          $0.entityType == .Player
        }

        completion(SqorResult.success(Box((teams, athletes))))

      case .error(let error):
        completion(SqorResult.error(error))
      }
    }
  }
}
func retrieveCannedRecommitedEntities()->Future{
返回Future(){completion in in
self.retrieve(.onboarding){中的响应
开关响应{
成功案例(let val):
让负载:AnyObject=val.value.json!作为AnyObject
让json=json(有效负载)
guard let suggestions=self.parseEntitiesFromJSON(json,atKey:“suggestion”)else{
完成(SqorResult.error(self.parsingeror))
}
让团队=建议.filter{
$0.entityType!=.Player
}
让运动员=建议.filter{
$0.entityType==.Player
}
完成(SqorResult.成功(方框((团队、运动员)))
案例错误(let error):
完成(SqorResult.error(error))
}
}
}
}

编译器错误意味着函数
Future
中的参数
completion
被指定为“非转义”(这是默认值)。这意味着,必须在函数
Future
返回之前执行闭包
完成

然而,实现表明,
完成
可以“转义”函数
未来
——这意味着,
完成
可以在函数
未来
返回后执行

为了修复此程序员错误,您需要确保在函数
Future
返回之前执行闭包
completion
,或者您需要将修饰符
@escaping
添加到参数
completion

另见

请注意,这两种解决方案都可能有影响,因为它们要么需要更改现有库(例如“未来”)中可能定义的函数的API,要么与您的用例不兼容,由于您在另一个-可能是转义-闭包中调用了
completion
,该闭包在
self.retrieve
中设置为参数


然而,“未来”语境中的“完成”概念明确规定,
completion
应该是“转义”。因此,将
@escaping
添加到
Future
的函数签名中似乎是一个不错的选择。

当闭包作为参数传递给函数时,闭包被称为对函数进行转义,但在函数返回后被调用。

如果用于闭包异步,意味着在函数执行后可能会调用闭包,则需要添加
@escaping

即使没有编译错误,也可能有运行时错误,因为可以释放闭包内存


@escaping
向您保证防止关闭。

我正在使用包含xcode 8.2的swift3中的函数。它通过“使用非转义参数‘completion’可能允许它转义”抛出错误。如果你们知道的话,请帮助我。改进的代码可读性为响应增加了难度。你们能帮助我如何将@escaping添加到完成中吗。在完成句柄之前添加@escaping谢谢你们的响应。你们能帮助我如何将@escaping添加到完成中吗。@saranya请阅读这里。(向下滚动一点)