Преобразование CGFloat в NSNumber в Swift

У меня есть расширение в Swift, которое содержит некоторые свойства, которые являются CGFloat. Проблема в том, что я не знаю, как получить в хранилище значение CGFloat как NSNumber, используя связанные объекты.

Вот код, который у меня есть, который не работает, но подробно описывает, что я хочу сделать:

var scaledFontSize: CGFloat {
    get {
        guard let fontSize = objc_getAssociatedObject(self, &AssociatedKeys.scaledFontSize) as? NSNumber else {
            //Set it
            let scaledFont:CGFloat = VGSizeValues.getValueFromValue(self.font.pointSize);
                //Fails here
            objc_setAssociatedObject(self,&AssociatedKeys.scaledFontSize, NSNumber( scaledFont),objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return scaledFont;
        }
        return CGFloat(fontSize.doubleValue);

    }
}

Есть ли способ обойти это?


person FireDragonMule    schedule 15.12.2015    source источник
comment
пусть floatInNumber = NSNumber (float: Float (floatValue))   -  person Adarsh G J    schedule 15.12.2015


Ответы (5)


В Свифт 3.0

let myFloat : CGFloat = 1234.5

let myNumber = NSNumber(value: Float(myFloat))

or

let myNumber = NSNumber(value: Double(myFloat))

В Свифт 2

let myNumber = NSNumber(double: myFloat.native)

or

let myNumber = NSNumber(double: Double(myFloat))

or

let myNumber = NSNumber(float: Float(myFloat))
person Community    schedule 15.12.2015
comment
проблема с let myNumber = NSNumber(value: Float(myFloat)) заключается в том, что я теряю точность CGFloat 0.4 => Float 0.400000006 - person CiNN; 13.10.2016

Для Свифт 3.1

var final_price: CGFloat = 12.34
let num = final_price as NSNumber
person Tot FOURLEAF    schedule 07.11.2016

Свифт 3

let myNumber = NSNumber(value: Float(myCGFloat))

person Raymond    schedule 10.08.2016

Для меня это работает.

self.configuration.cellHeight as NSNumber!
person Narasimha Nallamsetty    schedule 16.09.2016

Вы можете получить доступ к NativeType CGFloat через свойство native:

public var native: CGFloat.NativeType

Собственный тип, используемый для хранения CGFloat: Float для 32-разрядных архитектур и Double для 64-разрядных архитектур.

При этом вы можете создать NSNumber вот так:

NSNumber(value: cgFloat.native)
person Mark Leonard    schedule 09.09.2019
comment
Это должен быть правильный ответ! Используя Float(cgFloat), вы можете потерять точность, если родным типом является Double. NSNumber(value: cgFloat.native) это путь - person OscarVGG; 19.06.2020