将 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
的值,您可以调用 doubleValue
从 NSNumber
:
中检索 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
属性和方法可用。由于 NSNumber
有 doubleValue
属性,并且我们已经检查过 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]
我有一个包含以下值的数组:[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
的值,您可以调用 doubleValue
从 NSNumber
:
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
属性和方法可用。由于 NSNumber
有 doubleValue
属性,并且我们已经检查过 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]