sourcecode

Swift에서 CGFloat 반올림

codebag 2023. 9. 25. 22:36
반응형

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비트 차이에 대처할 수 있습니다.단순히 사용하는 경우에는ceilCGFloat 인수를 사용하면 이제 모든 아키텍처에서 작동해야 합니다.

내 원래 대답:

제 생각에 이건 꽤 끔찍합니다만, 누가 더 좋은 방법을 생각해 낼 수 있을까요?#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. 사용하기CGFloatrounded(_:)방법

FloatingPoint프로토콜은 이에 부합하는 유형을 메소드로 제공합니다.CGFloatrounded(_:)에는 다음과 같은 선언이 있습니다.

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

반응형