objective-c - Swift 无法将 NSNumber 桥接到 Float

标签 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

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

最佳答案

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

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 值。

关于objective-c - Swift 无法将 NSNumber 桥接到 Float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54098837/

相关文章:

ios - 跨多个 UICollectionViewControllers 重用 UICollectionView

iphone - 如何在 iPhone 上默认显示数字键盘?

objective-c - 从弹出窗口呈现 View

ios - Firebase - 当您不知道父键的值时访问子节​​点 - 由 childByAutoId() 生成

ios - Swift:在代码中更改条形按钮项目

ios - ARC 不允许将 'int' 隐式转换为 'NSArray*'

ios - 切换标签时 UITabBarController 变黑

iOS 图表 - 图表底部出现空白线

swift - NSNumberFormatter.stringFromNumber 会返回 nil 吗?

iphone - 正确地将 NSString 转换为 NSnumber