如何在Objective-C中保留Swift Double类型的.0小数部分?
问题分析与解决方案
首先得搞清楚为什么会出现这个情况:当Swift里的Double值是整数形式(比如1.0),桥接到Objective-C时会被自动包装成NSNumber。而NSNumber是一个通用数值容器,它会根据值的实际特征来选择存储类型——这里因为值是整数,所以它会以整数类型存储,自然输出的时候就没有.0了。
下面给你几种可行的解决思路,按需选择:
1. 直接转为字符串传递(最简单的展示方案)
如果你的需求只是在Objective-C中看到带.0的格式,不需要后续做数值计算,可以在Swift中直接把Double转成字符串再传递:
class Child: Parent { func log() { let measure = Double(1) let isLoggedIn = false // 把Double转为字符串,直接保留格式 let data: [String: Any] = ["is_logged_in": isLoggedIn, "measure": String(measure)] log(data) } }
在Objective-C中拿到的就是"1.0"字符串,直接输出即可。
2. 使用NSDecimalNumber包装(保留数值特性+格式)
如果还需要保留数值类型的特性(比如后续要计算),同时要保留小数位信息,可以用NSDecimalNumber来包装Swift的Double:
class Child: Parent { func log() { let measure = Double(1) let isLoggedIn = false // 用NSDecimalNumber包装,保留浮点特性 let decimalMeasure = NSDecimalNumber(value: measure) let data: [String: Any] = ["is_logged_in": isLoggedIn, "measure": decimalMeasure] log(data) } }
在Objective-C中处理时,直接调用stringValue就能得到带.0的结果:
-(void)log:(NSDictionary*)data { NSDecimalNumber *measure = data[@"measure"]; NSLog(@"%@", measure.stringValue); // 输出 1.0 }
3. 强制格式化输出(OC端处理,无需修改Swift)
如果不想改动Swift的传递逻辑,只需要在Objective-C输出的时候强制显示小数位,可以用格式化字符串:
-(void)log:(NSDictionary*)data { NSNumber *measure = data[@"measure"]; // 强制输出1位小数,不管原本是整数还是浮点数 NSLog(@"%.1f", measure.doubleValue); // 输出 1.0 }
这个方案适合只是展示需求的场景,不需要改变数据的传递类型。
4. 自定义包装类(复杂场景统一处理)
如果你的项目中有很多类似的需求,需要统一标识这类需要保留小数位的数值,可以自定义一个Swift的包装类:
@objc class DoubleWithDecimal: NSObject { let value: Double @objc init(value: Double) { self.value = value } @objc func formattedString() -> String { return String(value) } }
然后在传递时使用这个包装类:
class Child: Parent { func log() { let measure = Double(1) let isLoggedIn = false let wrappedMeasure = DoubleWithDecimal(value: measure) let data: [String: Any] = ["is_logged_in": isLoggedIn, "measure": wrappedMeasure] log(data) } }
在Objective-C中调用formattedString方法就能得到"1.0":
-(void)log:(NSDictionary*)data { DoubleWithDecimal *measure = data[@"measure"]; NSLog(@"%@", measure.formattedString()); // 输出 1.0 }
内容的提问来源于stack exchange,提问作者nambatee
相关产品推荐
相关产品推荐

