Dart中访问Map键对应值报错:Iterable<double>不支持*运算符
Dart CurrencyExchange类兑换金额计算错误修复
问题代码
你编写的CurrencyExchange类及出错的exchange方法代码如下:
class CurrencyExchange { Map<String, double> exchangeRates = { 'USD': 1.0, 'EUR': 0.85, 'JPY': 110.15, 'GBP': 0.72, 'AUD': 1.39, 'CAD': 1.25, 'CHF': 0.92, 'CNY': 6.47, 'HKD': 7.77, 'NZD': 1.41, }; exchange(double amount, String target) { if (exchangeRates.keys.contains(target.toUpperCase())) { // 错误代码: var newAmount = amount * (exchangeRates.values * 1.0); } } }
触发错误提示:The operator '*' isn't defined for the type 'Iterable<double>'
错误原因
exchangeRates.values返回的是Map中所有值的Iterable
正确实现
通过传入的target键(转成大写后)从Map中获取对应的单个汇率值,再与金额相乘即可。修改后的完整代码如下:
class CurrencyExchange { Map<String, double> exchangeRates = { 'USD': 1.0, 'EUR': 0.85, 'JPY': 110.15, 'GBP': 0.72, 'AUD': 1.39, 'CAD': 1.25, 'CHF': 0.92, 'CNY': 6.47, 'HKD': 7.77, 'NZD': 1.41, }; // 指定返回类型,代码更规范 double? exchange(double amount, String target) { final targetCurrency = target.toUpperCase(); // 直接用containsKey判断键是否存在,效率更高 if (exchangeRates.containsKey(targetCurrency)) { // 获取对应汇率值,已判断存在,用!断言非null final rate = exchangeRates[targetCurrency]!; // 计算兑换后的金额 return amount * rate; } // 目标货币不存在时返回null,也可根据需求抛出异常 return null; } }
关键细节
- 统一将
target转成大写,确保与Map中的键格式匹配 - 用
exchangeRates.containsKey()替代keys.contains(),减少一次集合遍历,性能更优 - 直接通过键获取单个汇率值,避免操作整个值集合
- 给方法指定返回类型
double?,明确返回值的可能状态
内容的提问来源于stack exchange,提问作者Emran
相关产品推荐
相关产品推荐

