Swift将NSNumber的对象转换为Double

我有这个代码在Swift中,它的工作原理,但我认为有一个更好的方式来从NSNumber获取我的对象,并将其转换为双精度:

var rating: NSNumber var ratingDouble: Double rating = self.prodResult?.prodsInfo.prodList[indexPath.row].avgRating as NSNumber!! ratingDouble = Double(rating.doubleValue) 

有几件事你可以做:

 var rating: NSNumber var ratingDouble: Double ratingDouble = rating as Double // 1 ratingDouble = Double(rating) // 2 ratingDouble = rating.doubleValue // 3 
  1. 第一个项目利用Objective-C桥接,它允许将AnyObjectNSNumber转换为Double|Float|Int|UInt|Bool
  2. 第二项大概是通过一个具有签名init(_ number: NSNumber)的构造函数。 我无法在模块或文档中find它,但传递AnyObject生成一个错误,它不能隐式地downcast到NSNumber所以它必须在那里,而不是桥接。
  3. 第三项不以相同的方式使用语言特征。 它只是利用了doubleValue返回一个Double的事实。

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

 let ratingDouble = self.prodResult!.prodsInfo.prodList[indexPath.row].avgRating! as Double 

请注意,我删除了? 从你的function和感动! 无论何时使用! 你是在逃避安全? 所以没有理由一起做。

使用guard let语法,这里是如何将AnyObject转换为Double

 guard let myVariable:Double = (myAnyObject as! NSNumber) as Double else { return }