将 NSObject 转换为双精度

Convert NSObject to double

我有一个包含以下值的数组:[0.1, 0.2, 0.18, "other"]。我认识到添加 "other" 使它成为一个 NSObject 数组。我希望能够在选择前三个值时将它们检索为双精度值,以便我可以将它们与其他双精度值相乘。但是,当我尝试简单地执行此操作时,它显示 "Can not put binary operator * with double and NSObject"。如何将 NSObject 类型转换或转换为双精度值?

您可以使用 as!:

强制转换
// let values = [0.1,0.2,0.3,"other"]
let val1 = values[0] as! Double
let val2 = values[1] as! Double
let val3 = values[2] as! Double
let other = values[3] as! String

print(val1 * val1)
print(val2 * val2)
print(val3 * val3)
print(other)

你只需要施放它... 简单的解决方案是这样的:

let arr: [NSObject] = [0.1, 0.2, 0.18, "other"]
let result = (arr[0] as! Double) * (arr[1] as! Double)

但是你应该避免强制转换并找到更好的解决方案。

您还可以 flatMap 您的数组并在结果中仅获取正确的值,例如:

let newArr = arr.flatMap { [=11=] as? Double }

但是你必须小心这个解决方案,因为你现在依赖于 Foundation 并且如果数组中的值略有不同,例如。 [0.1, 0.2, 0.18, "other", false] 你会得到 错误的 结果。


并且添加 "other" 并不能使这个数组成为 NSObject。它实际上也可以是 Any 类型,但是在将值转换为正确类型的情况下这不会改变任何东西,但会增加一些安全性并简化事情因为你不会依赖 基金会.

为了将您的 Double 存储在 NSObject 的数组中,它们将转换为 NSNumber

如果您遍历数组,使用 where 选择 NSNumber 的值并将它们分配给类型为 AnyObject 的值,您可以调用 doubleValueNSNumber:

中检索 Double
var myarr =  [0.1, 0.2, 0.18, "other"]

for d:AnyObject in myarr where d is NSNumber {
    print(d.doubleValue * 2)
}

输出:

0.2
0.4
0.36


解释:

这是可行的,因为任何对象(class 的实例)都可以分配给类型 AnyObject 的值,并且当 AnyObject 用作具体值时,所有已知 @objc 属性和方法可用。由于 NSNumberdoubleValue 属性,并且我们已经检查过 d 是一个 NSNumber,我们可以调用 doubleValue 知道它不会'不会在运行时崩溃。

大体上与 vacawama 的回答结果相同,但没有基金会的帮助

var myarr: Array<Any> =  [0.1, 0.2, 0.18, "other", true]

for d in myarr {
    if let d = d as? Double {
        print(d)
    }
}

打印

0.1
0.2
0.18

如果需要提取双精度数组,可以使用

let doubles = myarr.flatMap { [=12=] as? Double }
print(doubles)

打印

[0.1, 0.2, 0.18]

声明 var arr: Array<Any>var arr:[Any] 强制您的代码使用纯 Swift,即使您之前导入了 Foundation。

如果您需要将数组中的值转换为 Double 值(如果可能),我现在能看到的最简单的方法(请参阅下面的 vacawama 注释)类似于

let myarr:[Any] =  [0.1, 0.2, 0.18, "other", true, 17, "22.3", "-0.2e-1","27"]
let doubles = myarr.flatMap { Double("\([=14=])") }
print(doubles) // [0.1, 0.2, 0.18, 17.0, 22.3, -0.02, 27.0]