将NSObject转换为double

时间:2015-12-31 21:31:14

标签: ios swift casting double nsobject

我有一个包含以下值的数组:[0.1,0.2,0.18,“other”]。我认识到添加“other”使它成为一个NSObject数组。我希望能够在选择前三个值时将其检索为双精度值,这样我就可以将它们与其他双精度相乘。但是,当我尝试简单地执行此操作时,它会说“不能将二元运算符*与double和NSObject放在一起”。我怎样才能将NSObject转换或转换成双打?

4 个答案:

答案 0 :(得分:4)

您可以使用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)

答案 1 :(得分:2)

要将Double存储在NSObject的数组中,它们将转换为NSNumber s。

如果您遍历数组,使用NSNumber选择where的值并将其指定为AnyObject类型的值,则可以调用doubleValue在他们身上检索Double

中的NSNumber
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用作具体值时,所有已知{ {1}}属性和方法可用。由于@objc具有NSNumber属性,并且我们已经检查doubleValued,我们可以调用NSNumber知道它不会在运行时崩溃

答案 2 :(得分:2)

与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 { $0 as? Double }
print(doubles)

打印

[0.1, 0.2, 0.18]

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

如果你需要将数组中的值转换为Double值(如果可能的话),我现在能看到的最简单的方法(请参阅下面的vacawama&#39; s)就像是

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

答案 3 :(得分:1)

你只需要施展它...... 简单的解决方案就像:

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 { $0 as? Double }

但是你必须小心这个解决方案,因为你现在依赖基础,如果你在数组中有一个稍微不同的值,例如。 [0.1, 0.2, 0.18, "other", false]您将收到错误的结果。

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