【问题标题】:How can I cast NSDecimalNumber from Objective-C to Float in Swift without compiler warnings如何在没有编译器警告的情况下在 Swift 中将 NSDecimalNumber 从 Objective-C 转换为 Float
【发布时间】:2017-06-15 12:19:17
【问题描述】:

我在 Swift 3 中有这个功能:

if let rating = product.rating as? Float {
    itemRating.update(rating) //sets item rating. Number of stars
}

其中product.rating 是来自Objective C 函数的NSDecimalNumber。

我正在将所有东西都转换为 Swift。

每次我打电话给itemRating.update(rating) 都会臭名昭著:

致命错误:在展开可选值时意外发现 nil

我让它工作的唯一方法是通过这个丑陋的实现:

if let rating = product.rating as Decimal?, let floatRating = rating as? Float {
    itemRating.update(floatRating) //sets item rating. Number of stars
}

总是给出警告:

从 'Decimal' 转换为不相关的类型 'Float' 总是失败。

我尝试的所有其他方式都因上述错误而失败。


这是update()的定义:

- (void)updateRating:(float)inRating;

这是怎么回事?

【问题讨论】:

  • itemRating 是如何声明的?
  • 它是继承UIImageView的自定义类型
  • 如果它在itemRating.update(rating) 中崩溃,那么转换为浮点数不是问题!也许itemRating 是nil ?
  • 我尝试在update 函数中添加断点。甚至进不去update。
  • 这意味着转换不是问题。你有没有三重检查 itemRating 不是 nil ?

标签: objective-c swift optional


【解决方案1】:

如果product.rating 真的是NSDecimalNumber(不是(NS)Decimal)实例,只需使用可选绑定来解包可选然后获取floatValue,因为NSDecimalNumber 继承自NSNumber。

if let rating = product.rating {
    itemRating.update(rating.floatValue)
}

【讨论】:

    猜你喜欢
    • 2022-12-15
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多