为啥无法编译递归 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 处理程序之间调用自定义代码