在Swift中整理一个CGFloat
我怎么能在Swift中find一个CGFloat? 我已经尝试过ceil(CDouble(myCGFloat))
但只适用于iPad Air&iPhone 5S。
当在另一个模拟设备上运行时,我得到一个错误,说'NSNumber' is not a subtype of 'CGFloat'
更新 :苹果已经定义了一些CGFloat特定版本的常见function,如ceil
:
func ceil(x: CGFloat) -> CGFloat
…特别是为了应付32/64位的差异。 如果您只是使用CGFloat参数的ceil
,它现在应该适用于所有体系结构。
我原来的答案是:
我觉得这很可怕,但是谁能想出更好的办法? #if
似乎不适用于CGFLOAT_IS_DOUBLE
; 我认为你只能构buildconfiguration,从我在文档中可以看到的条件编译 。
var x = CGFloat(0.5) #if arch(x86_64) || arch(arm64) var test = ceil(x) #else var test = ceilf(x) #endif
最正确的语法可能是:
var f: CGFloat = 2.5 var roundedF = CGFloat(ceil(Double(f)))
要使用ceil
我将首先将CGFloat
为Double
,然后将其转换回CGFloat
。
当CGFloat
被定义为CFloat
或CFloat
时,这是CFloat
。
你也可以定义一个浮点数( 这实际上已经在Swift 2中实现了 ):
func ceil(f: CFloat) -> CFloat { return ceilf(f) }
那么你将可以直接打电话
var roundedF: CGFloat = ceil(f)
同时保持types安全。
我实际上相信这应该是苹果select的解决scheme,而不是单独的ceil
和ceilf
函数,因为它们在Swift中没有意义。
从Holex的答案build立。 我做了
func accurateRound(value: Double) -> Int { var d : Double = value - Double(Int(value)) if d < 0.5 { return Int(value) } else { return Int(value) + 1 } }
– 编辑扩展版 –
我最近也把这个变成了一个Float的扩展,以为我会分享:)
extension Float { func roundToInt() -> Int{ var value = Int(self) var f = self - Float(value) if f < 0.5{ return value } else { return value + 1 } } }
这是让你可以像
var f : Float = 3.3 f.roundToInt()
随着Swift 3,根据你的需要,你可以select以下四种方法之一来收集CGFloat
。
#1。 使用FloatingPoint
协议rounded(_:)
方法
FloatingPoint
协议提供符合它的typesrounded(_:)
方法。 rounded(_:)
具有以下声明:
func rounded(_ rule: FloatingPointRoundingRule) -> Self
使用指定的舍入规则将该值返回到整数值。
下面的Playground代码显示了如何使用rounded(_:)
为了四舍五入一个CGFloat
值:
import CoreGraphics let value1: CGFloat = -0.4 let value2: CGFloat = -0.5 let value3: CGFloat = -1 let value4: CGFloat = 0.4 let value5: CGFloat = 0.5 let value6: CGFloat = 1 let roundedValue1 = value1.rounded(.up) let roundedValue2 = value2.rounded(.up) let roundedValue3 = value3.rounded(.up) let roundedValue4 = value4.rounded(.up) let roundedValue5 = value5.rounded(.up) let roundedValue6 = value6.rounded(.up) print(roundedValue1) // prints -0.0 print(roundedValue2) // prints -0.0 print(roundedValue3) // prints -1.0 print(roundedValue4) // prints 1.0 print(roundedValue5) // prints 1.0 print(roundedValue6) // prints 1.0
#2。 使用ceil(_:)
函数
达尔文提供了具有以下声明的ceil(_:)
函数:
public func ceil<T : FloatingPoint>(_ x: T) -> T
下面的Playground代码显示了如何使用ceil(_:)
来取整CGFloat
值:
import CoreGraphics let value1: CGFloat = -0.4 let value2: CGFloat = -0.5 let value3: CGFloat = -1 let value4: CGFloat = 0.4 let value5: CGFloat = 0.5 let value6: CGFloat = 1 let roundedValue1 = ceil(value1) let roundedValue2 = ceil(value2) let roundedValue3 = ceil(value3) let roundedValue4 = ceil(value4) let roundedValue5 = ceil(value5) let roundedValue6 = ceil(value6) print(roundedValue1) // prints -0.0 print(roundedValue2) // prints -0.0 print(roundedValue3) // prints -1.0 print(roundedValue4) // prints 1.0 print(roundedValue5) // prints 1.0 print(roundedValue6) // prints 1.0
#3。 使用NSDecimalNumber
NSDecimalNumber
为四舍五入数字提供了一个详细但function强大的解决scheme。
import Foundation import CoreGraphics let value1: CGFloat = -0.4 let value2: CGFloat = -0.5 let value3: CGFloat = -1 let value4: CGFloat = 0.4 let value5: CGFloat = 0.5 let value6: CGFloat = 1 let scale: Int16 = 0 let behavior = NSDecimalNumberHandler(roundingMode: NSDecimalNumber.RoundingMode.up, scale: scale, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true) let roundedValue1 = NSDecimalNumber(value: Double(value1)).rounding(accordingToBehavior: behavior) let roundedValue2 = NSDecimalNumber(value: Double(value2)).rounding(accordingToBehavior: behavior) let roundedValue3 = NSDecimalNumber(value: Double(value3)).rounding(accordingToBehavior: behavior) let roundedValue4 = NSDecimalNumber(value: Double(value4)).rounding(accordingToBehavior: behavior) let roundedValue5 = NSDecimalNumber(value: Double(value5)).rounding(accordingToBehavior: behavior) let roundedValue6 = NSDecimalNumber(value: Double(value6)).rounding(accordingToBehavior: behavior) print(roundedValue1) // prints 0 print(roundedValue2) // prints 0 print(roundedValue3) // prints -1 print(roundedValue4) // prints 1 print(roundedValue5) // prints 1 print(roundedValue6) // prints 1
#4。 使用NumberFormatter
协议方法
如果你想在一个CGFloat
进行整理,并在同一个操作中用样式进行格式化,你可以使用NumberFormatter
。
import Foundation import CoreGraphics let value1: CGFloat = -0.4 let value2: CGFloat = -0.5 let value3: CGFloat = -1 let value4: CGFloat = 0.4 let value5: CGFloat = 0.5 let value6: CGFloat = 1 let formatter = NumberFormatter() formatter.numberStyle = NumberFormatter.Style.decimal formatter.roundingMode = NumberFormatter.RoundingMode.ceiling formatter.maximumFractionDigits = 0 let roundedValue1 = formatter.string(for: value1) let roundedValue2 = formatter.string(for: value2) let roundedValue3 = formatter.string(for: value3) let roundedValue4 = formatter.string(for: value4) let roundedValue5 = formatter.string(for: value5) let roundedValue6 = formatter.string(for: value6) print(String(describing: roundedValue1)) // prints Optional("-0") print(String(describing: roundedValue2)) // prints Optional("-0") print(String(describing: roundedValue3)) // prints Optional("-1") print(String(describing: roundedValue4)) // prints Optional("1") print(String(describing: roundedValue5)) // prints Optional("1") print(String(describing: roundedValue6)) // prints Optional("1")
这可能是有用的:
func roundUp(value: Double) -> Int { if value == Double(Int(value)) { return Int(value) } else if value < 0 { return Int(value) } else { return Int(value) + 1 } }