Быстрая проверка, если NSNumber является Двойным - PullRequest
0 голосов
/ 24 мая 2019

Поэтому я пытаюсь проверить, является ли 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 я использую такое расширение для номера, которое в swift равно NSNumber, и я хочу воссоздать его в 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()
    }
}

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вы можете получить тип номера, сохраненного с помощью низкоуровневого 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)
            }
        }
    }
}
0 голосов
/ 24 мая 2019

Попробуйте этот код.

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")
}
...