在Swift中收集CGFloat

时间:2014-06-12 10:20:08

标签: swift rounding cgfloat ceil

如何在Swift中对CGFloat进行舍入? 我试过ceil(CDouble(myCGFloat)),但这只适用于iPad Air& iPhone 5S。

在其他模拟设备上运行时,出现错误'NSNumber' is not a subtype of 'CGFloat'

6 个答案:

答案 0 :(得分:105)

更新:Apple现在定义了一些CGFloat特定版本的常用函数,例如ceil

func ceil(x: CGFloat) -> CGFloat

...专门应对32/64位差异。如果您只是将ceil与CGFloat参数一起使用,它现在应该适用于所有体系结构。

我原来的回答:

我认为这非常可怕,但任何人都可以想到更好的方法吗? #if似乎不适用于CGFLOAT_IS_DOUBLE;我认为您仅限于使用I can see in the documentation for conditional compilation

构建配置
var x = CGFloat(0.5)

#if arch(x86_64) || arch(arm64)
var test = ceil(x)
#else
var test = ceilf(x)
#endif

答案 1 :(得分:23)

使用Swift 4.2,根据您的需要,您可以选择以下3种方式之一来对CGFloat进行舍入。

#1。使用CGFloat的{​​{1}}方法

rounded(_:)协议为rounded(_:)方法提供符合它的类型。 FloatingPoint的{​​{1}}有以下声明:

CGFloat
  

使用指定的舍入规则将此值舍入为整数值。

下面的Playground示例代码显示了如何使用rounded(_:)来整理func rounded(_ rule: FloatingPointRoundingRule) -> CGFloat 值:

rounded(_:)

#2。使用CGFloat函数

Darwin 提供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 函数,该函数具有以下声明:

ceil(_:)

下面的Playground代码显示了如何使用ceil(_:)来舍入func ceil<T>(_ x: T) -> T where T : FloatingPoint 值:

ceil(_:)

#3。使用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 进行舍入并在同一操作中使用样式对其进行格式化,则可以使用NumberFormatter

NumberFormatter

答案 2 :(得分:20)

最正确的语法可能是:

var f: CGFloat = 2.5
var roundedF = CGFloat(ceil(Double(f)))

要使用ceil,我会首先将CGFloat设为Double,然后在天花板之后将其转换回CGFloat

CGFloat定义为CFloatCDouble时,该方法有效。

您还可以为浮点数定义ceil这实际上已在Swift 2中实现):

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

然后你就可以直接打电话了

var roundedF: CGFloat = ceil(f)

同时保持类型安全。

我实际上认为这应该是Apple选择的解决方案,而不是单独的ceilceilf函数,因为它们在Swift中没有意义。

答案 3 :(得分:7)

来自Swift Standard Library

您也可以就地对其进行处理:

var value: CGFloat = -5.7
value.round(.up) // -5.0

答案 4 :(得分:5)

建立holex的答案。我做了

func accurateRound(value: Double) -> Int {

            var d : Double = value - Double(Int(value))

            if d < 0.5 {
                return Int(value)
            } else {
                return Int(value) + 1
            }
        }

- 编辑扩展版 -

我最近也把它变成了Floats的扩展,以为我也会分享:)

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

答案 5 :(得分:0)

快速使用5

let x = 6.5

// Equivalent to the C 'round' function:
print(x.rounded(.toNearestOrAwayFromZero))
// Prints "7.0"

// Equivalent to the C 'trunc' function:
print(x.rounded(.towardZero))
// Prints "6.0"

// Equivalent to the C 'ceil' function:
print(x.rounded(.up))
// Prints "7.0"

// Equivalent to the C 'floor' function:
print(x.rounded(.down))
// Prints "6.0"