Swift中如何判断Decimal数值正负?遇'UInt32'无法转为'Bool'错误
解决Swift中判断Decimal正负时的'UInt32' is not convertible to 'Bool'错误
嘿,我来帮你搞定这个问题!你碰到的这个错误,几乎可以肯定是因为你直接尝试把Decimal的底层_sign属性(它是UInt32类型)当成布尔值来用了——比如写了if myDecimal._sign这种代码,这当然不行,因为UInt32类型不能直接作为条件判断的布尔值。
下面给你两种场景下的正确解决方案:
场景1:使用Swift原生Decimal(推荐)
从Swift 3开始引入的原生Decimal类型,提供了非常友好的API来判断正负:
方法1:利用sign枚举属性
Decimal的sign属性是Decimal.Sign枚举,包含.plus(正)和.minus(负)两个case,直接比较即可:
let targetNumber: Decimal = -45.67 if targetNumber.sign == .minus { print("这是一个负数") } else { print("这是正数或零") }
方法2:直接和0比较(更直观)
因为Decimal遵循Comparable协议,所以可以像普通数值一样直接和0对比:
if targetNumber < 0 { print("这是负数") }
这种方式更符合日常编程习惯,而且代码可读性更高。
场景2:使用Foundation的NSDecimal(老项目常见)
如果你的项目里还在使用Foundation框架的NSDecimal,千万别直接访问它的底层_sign字段(那个是UInt32类型,就是导致你报错的原因),应该用官方提供的NSDecimalCompare函数:
let nsDecimal: NSDecimal = NSDecimal(string: "-123.45")! let zeroNSDecimal = NSDecimal(string: "0")! // orderedAscending表示前者小于后者,也就是nsDecimal < 0 if NSDecimalCompare(&nsDecimal, &zeroNSDecimal) == .orderedAscending { print("这是一个负数") }
或者更简单的方式,把NSDecimal转换成Swift原生Decimal再处理:
let swiftDecimal = Decimal(nsDecimal) if swiftDecimal < 0 { print("这是负数") }
避坑总结
- 禁止直接访问Decimal/NSDecimal的底层UInt32类型sign属性,一定要用官方暴露的API
- 优先使用Swift原生Decimal,它的API更简洁、更符合Swift的编程风格
内容的提问来源于stack exchange,提问作者Marcos Tanaka
相关产品推荐
相关产品推荐

