Konversikan CGFloat ke NSNumber di Swift

Saya memiliki ekstensi di Swift yang menampung beberapa properti yaitu CGFloat. Masalahnya adalah saya tidak tahu cara menyimpan nilai CGFloat sebagai NSNumber menggunakan objek terkait

Ini kode yang saya miliki yang tidak berfungsi tetapi merinci apa yang ingin saya lakukan:

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);

    }
}

Apakah ada cara untuk mengatasi ini?


person FireDragonMule    schedule 15.12.2015    source sumber
comment
biarkan floatInNumber = NSNumber(float: Float(floatValue))   -  person Adarsh G J    schedule 15.12.2015


Jawaban (5)


Di Swift 3.0

let myFloat : CGFloat = 1234.5

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

or

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

Di Swift 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
masalahnya let myNumber = NSNumber(value: Float(myFloat)) adalah saya kehilangan presisi CGFloat 0.4 =› Float 0.400000006 - person CiNN; 13.10.2016

Untuk Swift 3.1

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

Cepat 3

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

person Raymond    schedule 10.08.2016

Bagi saya ini berhasil.

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

Anda dapat mengakses NativeType CGFloat melalui properti native:

public var native: CGFloat.NativeType

Tipe asli yang digunakan untuk menyimpan CGFloat, yaitu Float pada arsitektur 32-bit dan Double pada arsitektur 64-bit.

Dengan ini Anda dapat membuat NSNumber seperti:

NSNumber(value: cgFloat.native)
person Mark Leonard    schedule 09.09.2019
comment
Ini seharusnya menjadi jawaban yang benar! Dengan menggunakan Float(cgFloat) Anda mungkin kehilangan presisi jika tipe aslinya adalah Double. NSNumber(value: cgFloat.native) adalah jalan yang harus ditempuh - person OscarVGG; 19.06.2020