快速检查 NSNumber 是不是为 Double
Posted
技术标签:
【中文标题】快速检查 NSNumber 是不是为 Double【英文标题】:Swift check if NSNumber is Double快速检查 NSNumber 是否为 Double 【发布时间】:2019-05-24 12:04:40 【问题描述】:所以我试图检查NSNumber
是Double
还是Int
,我想知道这是否可能。
我希望这会起作用,但无论我比较哪种类型,它总是返回 true
var myDouble: Double = 0.0
var myNSNumber: NSNumber = NSNumber(value: myDouble)
if myNSNumber is Double
print("NSNumber is Double")
else
print("NSNumber is different type")
在 kotlin 中,我正在使用这样的数字扩展,即 NSNumber
在 swift 中,我想在 swift 中重新创建它
protected operator fun Number.plus(other: Number): Number
return when (this)
is Long -> this.toLong() + other.toLong()
is Int -> this.toInt() + other.toInt()
is Short -> this.toShort() + other.toShort()
is Byte -> this.toByte() + other.toByte()
is Double -> this.toDouble() + other.toDouble()
is Float -> this.toFloat() + other.toFloat()
【问题讨论】:
you 所说的“是 Double”是什么意思?你真的想检查里面的值是否可以正确表示为Double
,或者你想检查用于创建NSNumber
的值是否最初是Double
?
我想检查用于创建 NSNumber 的值是否最初是 Double
请问:为什么?除非您在做一些非常奇怪的事情,否则这对您来说一定无关紧要。
@luk2302 所说的。如果您需要来自 NSNumber 的 Double,为什么不直接致电 myNSNumber.doubleValue
?
也许你最好解释一下你想用这个实现什么,可能有一种不同的方法来做到这一点,而不是使用 NSNumber。我也很好奇,在您的 kotlin 代码 3 + 3.5 = 6 中,这是预期的行为吗?
【参考方案1】:
您可以使用低级CoreFoundation
API 获取存储的数字类型:
extension NSNumber
var type: CFNumberType
return CFNumberGetType(self as CFNumber)
然后你就可以使用它了。
你的plus
函数会是这样的:
extension NSNumber
func plus(other: NSNumber) -> NSNumber
switch type
case .sInt8Type, .charType:
return NSNumber(value: self.int8Value + other.int8Value)
case .sInt16Type, .shortType:
return NSNumber(value: self.int16Value + other.int16Value)
case .sInt32Type, .longType:
return NSNumber(value: self.int32Value + other.int32Value)
case .sInt64Type, .longLongType:
return NSNumber(value: self.int64Value + other.int64Value)
case .float32Type, .floatType:
return NSNumber(value: self.floatValue + other.floatValue)
case .float64Type, .doubleType:
return NSNumber(value: self.doubleValue + other.doubleValue)
case .intType, .cfIndexType, .nsIntegerType:
return NSNumber(value: self.intValue + other.intValue)
case .cgFloatType:
switch MemoryLayout<CGFloat>.size
case 4:
return NSNumber(value: self.floatValue + other.floatValue)
default:
return NSNumber(value: self.doubleValue + other.doubleValue)
【讨论】:
【参考方案2】:试试这个代码。
var myDouble: Double = 0.0
var myNSNumber: NSNumber = NSNumber(value: myDouble)
if myNSNumber.isKindOfClass(Double)
print("NSNumber is Double")
else
print("NSNumber is different type")
【讨论】:
以上是关于快速检查 NSNumber 是不是为 Double的主要内容,如果未能解决你的问题,请参考以下文章
将 NSNumber 更改为 Int/Double 后的错误
将“NSNumber *__strong”发送到不兼容类型“CLLocationDegrees”(又名“double”)的参数