Swift 无法将 NSNumber 桥接到 Float [重复]

Posted

技术标签:

【中文标题】Swift 无法将 NSNumber 桥接到 Float [重复]【英文标题】:Swift Unable to bridge NSNumber to Float [duplicate] 【发布时间】:2019-01-08 19:53:46 【问题描述】:

所以我有一个 NSArrays 加载了保存在 Shot 对象上的俯仰和偏航值。

@interface Shot : NSObject
@property (strong, nonatomic) NSArray *pitch;
@property (strong, nonatomic) NSArray *yaw;

我正在尝试快速处理一些数字并遇到一个非常奇怪的问题:

let pitch = Array(shot.recoil_pitch[0..<10]) as! [Float]
let yaw = Array(shot.recoil_yaw[0..<10]) as! [Float]

由于某种我无法弄清楚的原因,第一行运行良好。但是,第二行会抛出 Fatal error: Unable to bridge NSNumber to Float

当我在调试器中检查 shot.recoil_pitch[0..&lt;10] 时,我得到:

- 0 : 0
- 1 : -0.1355667114257812
- 2 : -2.584976196289062
- 3 : -2.238974571228027
- 4 : -1.606719017028809
- 5 : -1.54025936126709
- 6 : -1.570234298706055
- 7 : -1.544057846069336
- 8 : -1.323789596557617
- 9 : -1.073002815246582

当我检查 shot.recoil_yaw[0..&lt;10] 时,我得到:

- 0 : 0
- 1 : 0.017406463623046875
- 2 : -0.07871246337890625
- 3 : 0.004611968994140625
- 4 : 0.0446014404296875
- 5 : -0.0008544921875
- 6 : 0.010448455810546875
- 7 : 0.01015472412109375
- 8 : -0.002346038818359375
- 9 : -0.0569610595703125

关于为什么我可能会收到此错误的任何想法?

【问题讨论】:

当您检查 recoil_yaw 时,它会为您提供任何类型信息吗?如果您正在处理来自 Objective-C 的内容,最好将它们转换为原生 Objective-C 类 NSNumber,然后使用成员 floatValue 将它们映射到 Float recoil_yaw上的下标返回类型是什么?最好使用map 而不是强制转换为Array(shot.recoil_pitch[0..&lt;10]).map $0.floatValue 这也可能是相关的:***.com/a/50019421/1484378 相关:***.com/questions/49688983/… @Kamran - 没错,但如果不将$0 转换为NSNumber,他将无法直接调用floatValue;或 (b) 在他的 Objective-C 标头中使用轻量级泛型,例如@property (strong, nonatomic) NSArray&lt;NSNumber *&gt; *recoil_pitch. 【参考方案1】:

我可以用这个简单的例子重现这个问题:

var arr = [NSNumber(value: 1.3 as Float), NSNumber(value: 2.7)]

// This works
let x = arr.map  $0.floatValue 
print(x)
[1.3, 2.7]
// This fails with error 'Fatal error: Unable to bridge NSNumber to Float'
let y = arr as! [Float]
print(y)

如duplicate's answer 中所述,如果转换未保留确切值,则不能将NSNumber 转换为FloatDouble(2.7) 转换为 Float 时会丢失精度,因此转换失败。如果我为Double 选择2.5 而不是2.7,那么演员阵容会起作用。

使用.floatValue 访问值是可行的,因为它使用NSNumber 的属性来生成Float 值。

【讨论】:

问题不在于底层值是一个 Double,而是这个 Double 在转换为 Float 时没有完全保留。比较***.com/a/49689243/1187415。例如,var arr = [NSNumber(value: 1.3 as Float), NSNumber(value: 2.5)] 可以毫无问题地转换为 [Float]

以上是关于Swift 无法将 NSNumber 桥接到 Float [重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否可以为 (U)Int8/16/32/64 类型复制 Swifts 自动数值桥接到 Foundation (NSNumber)?

将 Obj-C 桥接到 Swift 后缺少啥

Swift 4.2 升级后将 Swift 类桥接到 React Native

在 Swift 3 中使用 NSNumber 和整数值

无法将 Float 类型的值转换为预期的参数类型 NSNumber

无法使用桥接头将 Objective-C 文件导入 Swift 项目