我有一个包含以下值的数组:[0.1,0.2,0.18,“other”]。我认识到添加“other”使它成为一个NSObject数组。我希望能够在选择前三个值时将其检索为双精度值,这样我就可以将它们与其他双精度相乘。但是,当我尝试简单地执行此操作时,它会说“不能将二元运算符*与double和NSObject放在一起”。我怎样才能将NSObject转换或转换成双打?
答案 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
属性,并且我们已经检查doubleValue
是d
,我们可以调用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
类型,但是在将值转换为正确类型的情况下,这不会改变任何内容,但会增加一些安全性并简化因为你不会依赖在基金会。