在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我将首先将CGFloatDouble ,然后将其转换回CGFloat

CGFloat被定义为CFloatCFloat时,这是CFloat

你也可以定义一个浮点数( 这实际上已经在Swift 2中实现了 ):

 func ceil(f: CFloat) -> CFloat { return ceilf(f) } 

那么你将可以直接打电话

 var roundedF: CGFloat = ceil(f) 

同时保持types安全。

我实际上相信这应该是苹果select的解决scheme,而不是单独的ceilceilf函数,因为它们在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 } }