快速检查 NSNumber 是不是为 Double

Posted

技术标签:

【中文标题】快速检查 NSNumber 是不是为 Double【英文标题】:Swift check if NSNumber is Double快速检查 NSNumber 是否为 Double 【发布时间】:2019-05-24 12:04:40 【问题描述】:

所以我试图检查NSNumberDouble 还是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

将 NSNumber 更改为 Int/Double 后的错误

将“NSNumber *__strong”发送到不兼容类型“CLLocationDegrees”(又名“double”)的参数

在 C# 中检查 double 是不是为整数的好方法是啥? [复制]

将核心数据中的 NSNumber 转换为 NSString

如何快速将 Int 转换为 int?