Як я можу округлити CGFloat в Swift? Я пробував, ceil(CDouble(myCGFloat))
але це працює лише на iPad Air та iPhone 5S.
Під час роботи на іншому імітованому пристрої з'являється повідомлення про помилку 'NSNumber' is not a subtype of 'CGFloat'
Як я можу округлити CGFloat в Swift? Я пробував, ceil(CDouble(myCGFloat))
але це працює лише на iPad Air та iPhone 5S.
Під час роботи на іншому імітованому пристрої з'являється повідомлення про помилку 'NSNumber' is not a subtype of 'CGFloat'
floor
і ceil
(або floorf
чи ceilf
) є ..
import Foundation
CGFloat
див. У цій відповіді .
Відповіді:
Оновлення : 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 наступних шляхів , щоб округлити a CGFloat
.
CGFloat
'srounded(_:)
методуFloatingPoint
протокол дає типи, що відповідають йому rounded(_:)
методом. CGFloat
«S rounded(_:)
має наступну заяву:
func rounded(_ rule: FloatingPointRoundingRule) -> CGFloat
Повертає це значення, округлене до інтегрального значення, використовуючи вказане правило округлення.
Наведений нижче приклад коду майданчика показує, як використовувати 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
Наведений нижче код майданчика показує, як використовувати 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
а, Double
а після стелі, я перетворюю його назад уCGFloat
.
Це працює, коли CGFloat
визначається як CFloat
абоCDouble
.
Ви також можете визначити a ceil
для floats ( Це насправді було реалізовано в 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()