如何理解Swift 5.5中Int与Double转换规则及加法编译报错问题
Swift 整数与浮点数运算编译规则说明
首先先贴出你提到的示例代码:
3 + 0.14 // allowed let three = 3 let rest = 0.14 3 + rest // allowed 0.14 + three // compile error three + 0.14 // compile error
核心规则前提
Swift 是类型安全语言,默认不会做任何隐式的数值类型转换,不同类型的数值必须显式转换为相同类型后才能运算,唯一的例外是纯字面量的类型推断逻辑:
- 直接书写的整数字面量、浮点字面量本身没有固定类型,会根据运算上下文自动推断为匹配的类型
- 已经完成赋值声明的变量/常量,类型是固定的,不会随后续运算逻辑变更
逐行逻辑解释
3 + 0.14编译通过:两个操作数都是纯字面量,Swift 会自动将整数字面量3推断为Double类型,和浮点字面量0.14的类型匹配,符合运算要求。let three = 3:没有指定类型的情况下,整数字面量赋值给常量默认推断为Int类型,three的类型从此固定为Int。let rest = 0.14:同理,浮点字面量赋值给常量默认推断为Double类型,rest的类型从此固定为Double。3 + rest编译通过:3是纯字面量,会根据右侧已知的Double类型的rest,自动推断自身为Double类型,类型匹配可以运算。0.14 + three编译报错:three是已经固定类型的Int常量,0.14默认推断为Double,两种不同类型的数值没有隐式转换规则,无法直接运算。three + 0.14编译报错:和上一行同理,three是固定的Int类型,即使和浮点字面量运算,Swift 也不会自动将Int转换为Double,类型不匹配报错。
修复方案
如果需要运算不同类型的数值,必须显式做类型转换:
// 把Int转为Double后运算 Double(three) + 0.14 0.14 + Double(three) // 也可以把Double转为Int后运算,会丢失小数部分 three + Int(rest)
内容的提问来源于stack exchange,提问作者al_lea
相关产品推荐
相关产品推荐

