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..<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
关于为什么我可能会收到此错误的任何想法?
【问题讨论】:
当您检查recoil_yaw
时,它会为您提供任何类型信息吗?如果您正在处理来自 Objective-C 的内容,最好将它们转换为原生 Objective-C 类 NSNumber
,然后使用成员 floatValue
将它们映射到 Float
。
recoil_yaw
上的下标返回类型是什么?最好使用map
而不是强制转换为Array(shot.recoil_pitch[0..<10]).map $0.floatValue
这也可能是相关的:***.com/a/50019421/1484378
相关:***.com/questions/49688983/…
@Kamran - 没错,但如果不将$0
转换为NSNumber
,他将无法直接调用floatValue
;或 (b) 在他的 Objective-C 标头中使用轻量级泛型,例如@property (strong, nonatomic) NSArray<NSNumber *> *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
转换为Float
。 Double(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)?
Swift 4.2 升级后将 Swift 类桥接到 React Native