为啥无法编译递归 PromiseKit 函数?

Posted

技术标签:

【中文标题】为啥无法编译递归 PromiseKit 函数?【英文标题】:Why recursive PromiseKit functions cannot be compiled?为什么无法编译递归 PromiseKit 函数? 【发布时间】:2018-07-14 17:13:32 【问题描述】:

我有下一个递归 Promise 函数调用:

 func getPlaces(location: Location) -> Promise<[Geosearch]> 
   return Promise().then 
     URLSession.shared.dataTask(.promise, with: url)
   .compactMap  result in
     let json = try JSONDecoder().decode(JsonPlaces.self, from: result.data)
     let places = json.query.geosearch
     return places
   
 

 func getAtLeastOnePlace(location: Location) -> Promise<[Geosearch]> 
   return getPlaces(location).then places in      //error here
     if hasNonVisitedPlaces(places: places) 
        return Promise.value(places)
      else 
        return getPlaces(location)
     
   
 

 func hasNonVisitedPlaces(places: [Geosearch]) -> Bool 
     return places.count > 0
 

但是编译器构建失败,出现错误“无法将'Promise<_.t>'类型的返回表达式转换为'Promise'类型。错误在哪里?


这似乎是编译器错误。 该函数已正确编译:

 func getAtLeastOnePlace(location: Location) -> Promise<[Geosearch]> 
   return getPlaces(location).then places in                            
      return Promise.value(places)
   
 

这个功能也是:

 func getAtLeastOnePlace(location: Location) -> Promise<[Geosearch]> 
   return getPlaces(location).then places in                            
      return getPlaces(location)
   
 

但是这个函数导致了错误:

 func getAtLeastOnePlace(location: Location) -> Promise<[Geosearch]> 
   return getPlaces(location).then places in      //error here
     if hasNonVisitedPlaces(places: places) 
        return Promise.value(places)
      else 
        return getPlaces(location)
     
   
 

【问题讨论】:

错误出现在哪一行? 已更新错误行标记 【参考方案1】:

有时我们需要显式地提供返回类型,所以试试下面。

func getAtLeastOnePlace(location: Location) -> Promise<[Geosearch]> 
   return getPlaces(location).then places -> Promise<[Geosearch]> in
     if hasNonVisitedPlaces(places: places) 
        return Promise.value(places)
      else 
        return getPlaces(location)
     
   
 

【讨论】:

以上是关于为啥无法编译递归 PromiseKit 函数?的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit:无法在 then 处理程序之间调用自定义代码

PromiseKit 无法在链中命中

为啥这个递归函数返回正确的值? [复制]

PromiseKit 不能与 Swift 2 和 Xcode 7 一起编译

为啥我们需要在这个递归函数中返回

从 PromiseKit 包装迁移