Swift中将字典键值对映射为[(Date,Double)]数组出现类型歧义错误如何解决
错误成因
这个「type of expression is ambiguous without more context」错误是Swift编译器的类型推断能力不足导致的:你同时链式调用了map和sorted两个高阶函数,且闭包返回的是元组类型,编译器无法自动推断整个链式表达式的最终类型是否和[(Date, Double)]匹配,并非你的赋值逻辑存在问题。
另外你现有代码还隐含一个隐藏问题:Double($0.value.close)的转换结果是可选类型Double?,你没有做解包处理,即便类型推断问题解决,后续也会报错。
解决方法
方案1:明确标注闭包返回类型(最简便)
给map的闭包明确声明返回值类型,编译器就能正常识别类型:
self.timeSeriesData = decoded.timeSeries.map { (key, value) -> (Date, Double) in (dateFormatter.date(from: key)!, Double(value.close)!) }.sorted { $0.0 < $1.0 }
方案2:拆分链式调用
把map和sorted的调用拆分到两行,单独做类型推断:
let mappedResult = decoded.timeSeries.map { (dateFormatter.date(from: $0.key)!, Double($0.value.close)!) } self.timeSeriesData = mappedResult.sorted { $0.0 < $1.0 }
方案3:安全处理可选值(更推荐)
不要直接用!强解可选值,避免日期解析失败、收盘价转Double失败时出现运行时崩溃,改用compactMap过滤无效数据:
self.timeSeriesData = decoded.timeSeries.compactMap { key, value -> (Date, Double)? in // 校验日期和收盘价都转换成功才保留数据 guard let validDate = dateFormatter.date(from: key), let closePrice = Double(value.close) else { return nil } return (validDate, closePrice) }.sorted { $0.0 < $1.0 }
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

