แปลง 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 (ลอย: ลอย (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
ปัญหาของการให้ 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