Swift에서 CGFloat 반올림
스위프트에서 CGFloat를 반올림하려면 어떻게 해야 합니까?노력했습니다.ceil(CDouble(myCGFloat))
아이패드 에어와 아이폰 5S에서만 가능합니다.
다른 모의실험 장치에서 실행할 때 다음과 같은 오류가 발생합니다.'NSNumber' is not a subtype of 'CGFloat'
업데이트: Apple은 다음과 같은 일반적인 기능의 CGFloat 특정 버전을 정의했습니다.ceil
:
func ceil(x: CGFloat) -> CGFloat
...specif적으로 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를 사용하면 다음 세 가지 경로 중 하나를 선택하여 한 개의 경로를 반올림할 수 있습니다.CGFloat
.
#1. 사용하기CGFloat
의rounded(_:)
방법
FloatingPoint
프로토콜은 이에 부합하는 유형을 메소드로 제공합니다.CGFloat
의rounded(_:)
에는 다음과 같은 선언이 있습니다.
func rounded(_ rule: FloatingPointRoundingRule) -> CGFloat
지정된 반올림 규칙을 사용하여 이 값을 적분 값으로 반올림합니다.
아래 Playground 샘플 코드는 사용 방법을 보여줍니다.rounded(_:)
A를 반올림하기 위해서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(_:)
다음과 같은 선언을 가지는 함수.
func ceil<T>(_ x: T) -> T where T : FloatingPoint
아래 Playground 코드는 사용 방법을 보여줍니다.ceil(_:)
A를 반올림하기 위해서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. 사용하기NumberFormatter
만약 당신이 반올림하고 싶다면.CGFloat
동일한 작업에서 스타일로 포맷할 수 있습니다.
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")
swift 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"
가장 정확한 구문은 다음과 같습니다.
var f: CGFloat = 2.5
var roundedF = CGFloat(ceil(Double(f)))
사용방법ceil
제가 먼저.CGFloat
a Double
그리고 천장이 끝난 후에, 나는 그것을 다시 전환합니다.CGFloat
.
그것은 효과가 있습니다.CGFloat
다음과 같이 정의됩니다.CFloat
아니면CDouble
.
A를 정의할 수도 있습니다.ceil
플로트의 경우(이는 Swift 2에서 실제로 구현되었습니다):
func ceil(f: CFloat) -> CFloat {
return ceilf(f)
}
그러면 당신은 직접 전화를 할 수 있을 겁니다.
var roundedF: CGFloat = ceil(f)
형식 안전성을 유지하면서 말입니다.
저는 사실 이것이 애플이 선택한 해결책이 되어야 한다고 생각합니다. 별도의 문제를 가지는 것입니다.ceil
그리고.ceilf
기능들은 스위프트에서 말이 안 되기 때문입니다.
Swift Standard Library에서는 다음과 같이 반올림할 수 있습니다.
var value: CGFloat = -5.7
value.round(.up) // -5.0
홀렉스의 답변을 토대로 한 것입니다.했다
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()
사용하다rounded
방법.
데모(스위프트 5.5.2):
CGFloat(5.0).rounded(.up) // -> 5
CGFloat(5.1).rounded(.up) // -> 6
CGFloat(5.2).rounded(.up) // -> 6
CGFloat(5.3).rounded(.up) // -> 6
CGFloat(5.4).rounded(.up) // -> 6
CGFloat(5.5).rounded(.up) // -> 6
CGFloat(5.6).rounded(.up) // -> 6
CGFloat(5.7).rounded(.up) // -> 6
CGFloat(5.8).rounded(.up) // -> 6
CGFloat(5.9).rounded(.up) // -> 6
언급URL : https://stackoverflow.com/questions/24181992/round-up-a-cgfloat-in-swift
'sourcecode' 카테고리의 다른 글
mariadb에서 상태 쿼리 오류 표시 (0) | 2023.09.25 |
---|---|
각 2에서 $임의치는 무엇입니까? (0) | 2023.09.25 |
IntelliJ의 @ConfigurationProperties를 사용하여 Spring Boot Configuration Annotation Processor를 구성하는 방법은 무엇입니까? (0) | 2023.09.25 |
SQL Server에서 대량 사용 권한을 활성화하는 방법 (0) | 2023.09.25 |
팔로우하신 링크가 만료되었습니다.again.in 워드프레스를 시도해보시기 바랍니다. (0) | 2023.09.20 |