Swift无法将NSNumber桥接到Float

时间:2019-01-08 19:53:46

标签: objective-c swift nsnumber bridging

所以我有一个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..<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..<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

关于我为什么会出现此错误的任何想法?

1 个答案:

答案 0 :(得分:2)

我可以通过以下简单示例重现此问题:

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时会失去精度,因此强制转换失败。如果我为2.5选择了2.7而不是Double,则强制转换就可以了。

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