首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift将NSNumber对象转换为双精度

Swift将NSNumber对象转换为双精度
EN

Stack Overflow用户
提问于 2014-12-04 02:29:12
回答 1查看 37.9K关注 0票数 30

我在Swift中有这段代码,它可以工作,但我认为有一种更好的方法可以从NSNumber获取对象并将其转换为Double:

代码语言:javascript
复制
var rating: NSNumber
var ratingDouble: Double

rating = self.prodResult?.prodsInfo.prodList[indexPath.row].avgRating as NSNumber!!

ratingDouble = Double(rating.doubleValue)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-04 02:55:29

更新

从1.0开始,Swift在这里的行为发生了很大的变化。以前并不是那么容易,但Swift使number类型之间的转换变得更加困难,因为它希望您清楚地知道如何处理精度损失。您的新选择现在如下所示:

代码语言:javascript
复制
var rating: NSNumber
var ratingDouble: Double

ratingDouble = rating as! Double // 1
ratingDouble = Double(exactly: rating)! // 2

ratingDouble = Double(truncating: rating) // 3
ratingDouble = rating.doubleValue // 4

if let x = rating as? Double { // 5
    ratingDouble = x
}

if let x = Double(exactly: rating) { // 6
    ratingDouble = x
}

  1. 此函数调用Double._forceBridgeFromObjectiveC,后者根据rating中的存储类型使用DoubleInt64UInt64调用Double(exactly:)。如果数字不能精确地表示为Double,它将失败并使应用程序崩溃。例如,UInt64.max的位数超过了Double可以存储的位数,所以它将崩溃。
  2. 这与1完全相同,除了它也可能在NaN上崩溃,因为那个检查不是included.
  3. This函数,总是返回一个Double,但是在1和2会崩溃的情况下会失去精度。This literally just calls doubleValue when passing in an NSNumber.
  4. Same as 3.类似于1,不同之处在于,它不会使应用程序崩溃,而是返回nil,语句内部也不会将evaluated.
  5. Same设置为5,但如果值为NaN.

,则2将返回nil

如果你知道你的数据源是双精度的,那么1-4可能会为你提供大致相同的服务。不过,3和4将是我的首选。

Swift 1和2的旧答案

您可以执行以下几项操作:

代码语言:javascript
复制
var rating: NSNumber
var ratingDouble: Double

ratingDouble = rating as Double   // 1
ratingDouble = Double(rating)     // 2
ratingDouble = rating.doubleValue // 3

第一个项目利用了Objective-C桥接,这允许将AnyObjectNSNumber转换为Double|Float|Int|UInt|Bool.

  • The,第二个项目大概通过一个带有签名init(_ number: NSNumber)的构造函数。我在模块或文档中找不到它,但是传入AnyObject会产生一个错误,它不能隐式地向下转换为NSNumber,所以它必须存在,而且不仅仅是bridging.

  • The第三项没有以同样的方式使用语言特性。它只是利用了doubleValue返回Double.

这一事实

1的一个好处是它也适用于AnyObject,所以你的代码可以是:

代码语言:javascript
复制
let ratingDouble = self.prodResult!.prodsInfo.prodList[indexPath.row].avgRating! as Double

注意,我从您的函数中删除了?,并将!移入其中。无论何时使用!您正在避开?的安全性,所以没有理由同时使用这两种方法。

票数 72
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27279032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档