swift – CGFloat和NSNumber之间的转换,没有不必要的升级到Doubl
众所周知,CGFloat(在CoreGraphics,UIKit等中无处不在)
可以是32位或64位浮点数,具体取决于 处理器架构. 在C,CGFloat中它是一种类型 已经反复观察到可以从中创建NSNumber CGFloat <--> Double <--> NSNumber 例: let c1 = CGFloat(12.3) let num = NSNumber(double: Double(c1)) let c2 = CGFloat(num.doubleValue) 这很简单,也没有精确度. 然而,如果可以进行转换,它引起了我的好奇心 可以使用构建配置语句(例如在Should conditional compilation be used to cope with difference in CGFloat on different architectures?中): extension NSNumber { convenience init(cgFloatValue value : CGFloat) { #if arch(x86_64) || arch(arm64) self.init(double: value.native) #else self.init(float: value.native) #endif } } 但是如果将Swift移植到其他没有的架构上会怎么样呢 也可以使用CGFLOAT_IS_DOUBLE常量(例如,在 if CGFLOAT_IS_DOUBLE != 0 { // ... } else { // ... } 这里的缺点是编译器将始终发出一个 所以长话短说: >我们如何在之间进行转换 请注意,这是一个“学术”问题.如上所述 我在这里发布了一个“自我回答”的精神
更新:可以将CGFloat值转换为NSNumber并返回:
let c1 = CGFloat(12.3) let num = c1 as NSNumber let c2 = num as CGFloat 这保留了CGFloat的精度,并与Swift 2一起使用 (以前的答案 – 太复杂了):我找到了两种解决方案.第一个使用免费桥接 extension NSNumber { // CGFloat -> NSNumber class func numberWithCGFloat(var value: CGFloat) -> NSNumber { return CFNumberCreate(nil,.CGFloatType,&value) } // NSNumber -> CGFloat var cgFloatValue : CGFloat { var value : CGFloat = 0 CFNumberGetValue(self,&value) return value } } 这很简单.唯一的缺点:我无法弄清楚 第二种可能的解决方案有点长: extension NSNumber { // CGFloat -> NSNumber private convenience init(doubleOrFloat d : Double) { self.init(double : d) } private convenience init(doubleOrFloat f : Float) { self.init(float : f) } convenience init(cgFloat : CGFloat) { self.init(doubleOrFloat: cgFloat.native) } // NSNumber -> CGFloat private func doubleOrFloatValue() -> Double { return self.doubleValue } private func doubleOrFloatValue() -> Float { return self.floatValue } var cgFloatValue : CGFloat { return CGFloat(floatLiteral: doubleOrFloatValue()) } } 有两个私有的“helper”init方法具有相同的外部 convenience init(cgFloat : CGFloat) { self.init(doubleOrFloat: cgFloat.native) } 访问器方法中的相同想法.从self.native的类型 var cgFloatValue : CGFloat { return CGFloat(floatLiteral: doubleOrFloatValue()) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iphone – 找不到编译器警告的方法
- c – 在取消引用指针的地址上在Visual Studio 2005中设置数
- c# – 回滚由Fluent NHibernate中的PersistenceSpecificati
- react-native – 当access为true时,React Native无法找到子
- 在postgresql中:如何创建一个可以重置的简单计数器?
- c – 做一个static_assert,一个模板类型是另一个模板
- cosf(M_PI_2)不返回零
- oracle导出结果集为xml格式文件
- ruby – 在postgres Rails-4中查询Json数据类型
- c# – 为什么我不能在asp.net webforms中这样做?