无法将“Promise<[NSDictionary]>”类型的值转换为预期的参数类型“Guarantee<Void>”

Posted

技术标签:

【中文标题】无法将“Promise<[NSDictionary]>”类型的值转换为预期的参数类型“Guarantee<Void>”【英文标题】:Cannot convert value of type 'Promise<[NSDictionary]>' to expected argument type 'Guarantee<Void>' 【发布时间】:2018-05-09 17:06:24 【问题描述】:

目前,当我将 PromiseKit 从 Swift 2 更新到 Swift 4 时遇到问题。我的很多 Promise 都将这个问题从 NSDictionary 返回到 Guarantee Void。我不明白为什么会出现这个问题。如果有人能给我解释一下,那将不胜感激!

func getPlayerGameLog(sportName: String) -> Promise<NSArray> 
    let team = (self as? PlayerWithPositionAndGame)?.team
    let position = (self as? PlayerWithPositionAndGame)?.position

    if sportName == "mlb" 
        return when(Data.mlbPlayerGameLogs[id].get(), Data.sportsTeams[sportName].get()).then  (result, teams) -> NSArray in
            if result.count == 0 
                return []
             else 
                // Omitted Code
                return gameStats
            
        
     else if sportName == "nfl" 
        return when(Data.nflPlayerGameLogs[id].get(), Data.sportsTeams[sportName].get()).then  (result, teams) -> NSArray in
            if result.count == 0 
                return []
             else 
                // Omitted Code
                return gameStats
            
        
     else 
        return Data.nbaPlayerGameLogs[id].get().then  gameLogs in
            return []
        
    

现在游戏日志的声明如下

static let mlbPlayerGameLogs = MultiCache  id in API.getMLBPlayerGameLogs(playerID: id) 

mlb/nfl/nba 也一样。

函数的目的很简单。它只是将团队信息拉入函数并返回。

“return when()”行发生错误

【问题讨论】:

这个错误出现在哪里? 添加编辑,第5、14、23行出现错误 看我的回答。应该有帮助。 【参考方案1】:

首先,它是 swift 4,你不应该使用 NS... 类型,现在有纯 swift 类型。

接下来,根据release notes:

then 接受了之前的承诺值,并要求您返回一个承诺。 done 被输入之前的承诺值并返回一个 Void 承诺(这是链使用量的 80%) map 被提供了先前的承诺值,并要求您返回非承诺,即。一个值。

几乎所有then 都应替换为map

另外,您应该将when 重写为when(fulfilled:) 以返回Promise,而不是Guarantee

【讨论】:

以上是关于无法将“Promise<[NSDictionary]>”类型的值转换为预期的参数类型“Guarantee<Void>”的主要内容,如果未能解决你的问题,请参考以下文章

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端

C# 无法将类型为“System.Byte[]”的对象强制转换为类型“System.Data.DataTable

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS

无法将 .json 文件从 CSV 下载到 JSON 转换并且无法将 JSON 转换为 CSV

无法将 ReactiveUI 添加到 NUnit 测试项目

“无法将图像数据写入路径” - Laravel 图像干预