我在Swift中有这段代码,它可以工作,但我认为有一种更好的方法可以从NSNumber获取对象并将其转换为Double:
var rating: NSNumber
var ratingDouble: Double
rating = self.prodResult?.prodsInfo.prodList[indexPath.row].avgRating as NSNumber!!
ratingDouble = Double(rating.doubleValue)
发布于 2014-12-04 02:55:29
更新
从1.0开始,Swift在这里的行为发生了很大的变化。以前并不是那么容易,但Swift使number类型之间的转换变得更加困难,因为它希望您清楚地知道如何处理精度损失。您的新选择现在如下所示:
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
}
Double._forceBridgeFromObjectiveC
,后者根据rating
中的存储类型使用Double
、Int64
或UInt64
调用Double(exactly:)
。如果数字不能精确地表示为Double
,它将失败并使应用程序崩溃。例如,UInt64.max
的位数超过了Double
可以存储的位数,所以它将崩溃。NaN
上崩溃,因为那个检查不是included.Double
,但是在1和2会崩溃的情况下会失去精度。This literally just calls doubleValue
when passing in an NSNumber
.NaN
.,则2将返回nil
如果你知道你的数据源是双精度的,那么1-4可能会为你提供大致相同的服务。不过,3和4将是我的首选。
Swift 1和2的旧答案
您可以执行以下几项操作:
var rating: NSNumber
var ratingDouble: Double
ratingDouble = rating as Double // 1
ratingDouble = Double(rating) // 2
ratingDouble = rating.doubleValue // 3
第一个项目利用了Objective-C
桥接,这允许将AnyObject
和NSNumber
转换为Double|Float|Int|UInt|Bool
.
init(_ number: NSNumber)
的构造函数。我在模块或文档中找不到它,但是传入AnyObject
会产生一个错误,它不能隐式地向下转换为NSNumber
,所以它必须存在,而且不仅仅是bridging.
doubleValue
返回Double
.这一事实
1的一个好处是它也适用于AnyObject
,所以你的代码可以是:
let ratingDouble = self.prodResult!.prodsInfo.prodList[indexPath.row].avgRating! as Double
注意,我从您的函数中删除了?
,并将!
移入其中。无论何时使用!您正在避开?
的安全性,所以没有理由同时使用这两种方法。
https://stackoverflow.com/questions/27279032
复制相似问题