如何在Swift中汇总CGFloat?我已经尝试过了,ceil(CDouble(myCGFloat))
但是只能在iPad Air和iPhone 5S上使用。
在另一台模拟设备上运行时,出现错误提示 'NSNumber' is not a subtype of 'CGFloat'
如何在Swift中汇总CGFloat?我已经尝试过了,ceil(CDouble(myCGFloat))
但是只能在iPad Air和iPhone 5S上使用。
在另一台模拟设备上运行时,出现错误提示 'NSNumber' is not a subtype of 'CGFloat'
floor
或ceil
(或floorf
或ceilf
)是...
import Foundation
CGFloat
请参见此答案。
Answers:
更新:Apple现在已经定义了一些CGFloat特定版本的常用功能,例如ceil
:
func ceil(x: CGFloat) -> CGFloat
...专门解决32/64位的差异。如果仅使用ceil
CGFloat参数,则它现在应在所有体系结构上都适用。
我的原始答案:
我认为这太可怕了,但是谁能想到更好的方法?#if
似乎没有工作CGFLOAT_IS_DOUBLE
; 根据我在条件编译文档中看到的内容,我认为您仅限于构建配置。
var x = CGFloat(0.5)
#if arch(x86_64) || arch(arm64)
var test = ceil(x)
#else
var test = ceilf(x)
#endif
使用Swift 5,您可以选择以下3条路径之一来取整CGFloat
。
CGFloat
的rounded(_:)
方法FloatingPoint
协议给符合它的类型提供一种rounded(_:)
方法。CGFloat
的rounded(_:)
具有以下声明:
func rounded(_ rule: FloatingPointRoundingRule) -> CGFloat
使用指定的舍入规则返回将此值舍入为整数值。
下面的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
ceil(_:)
功能达尔文提供的ceil(_:)
函数具有以下声明:
func ceil<T>(_ x: T) -> T where T : FloatingPoint
下面的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
NumberFormatter
如果您想对a进行四舍五入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")
最正确的语法可能是:
var f: CGFloat = 2.5
var roundedF = CGFloat(ceil(Double(f)))
要使用该功能,ceil
我会先设置CGFloat
a Double
,然后设置上限,然后将其转换回CGFloat
。
在CGFloat
定义为CFloat
或时有效CDouble
。
您还可以定义一个ceil
for浮点数(这实际上已在Swift 2中实现):
func ceil(f: CFloat) -> CFloat {
return ceilf(f)
}
这样您就可以直接致电
var roundedF: CGFloat = ceil(f)
同时保持类型安全。
我实际上认为这应该是Apple选择的解决方案,而不是具有单独的ceil
和ceilf
功能,因为它们在Swift中没有意义。
'NSNumber' is not a subtype of 'CGFloat'
快速使用它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"
在Swift标准库中,您也可以将其四舍五入:
var value: CGFloat = -5.7
value.round(.up) // -5.0
println("\(roundUp(Double(180.0)))") //prints 181, should print 180
(-5.0) - (-5.7) = 0.7
吗?
以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()