【问题标题】:Swift check if NSNumber is Double快速检查 NSNumber 是否为 Double
【发布时间】:2023-03-20 22:55:01
【问题描述】:

所以我试图检查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 中,这是预期的行为吗?

标签: ios swift nsnumber


【解决方案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")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 2014-07-28
      • 2010-10-19
      相关资源
      最近更新 更多