W.r.t. встроенные функции, я думаю, что ближе всего вы получите это Foundation
метод copysign(_: Double, _: Double) -> Double
let foo = -15.2
let sign = copysign(1.0, foo) // -1.0 (Double)
Естественно нуждаясь некоторое преобразование типов в случае, если вы не работает, по ряду типа Double
.
Однако я не вижу причин, почему бы не создать собственное расширение, соответствующее вашим потребностям, особенно для такой простой функции, как sign
, поскольку они не должны раздуваться, например.
extension IntegerType {
func sign() -> Int {
return (self < 0 ? -1 : 1)
}
/* or, use signature: func sign() -> Self */
}
extension FloatingPointType {
func sign() -> Int {
return (self < Self(0) ? -1 : 1)
}
}
(здесь приносит 1
также 0
, как в примере, в вашем вопросе).
(Edit в отношении Вашего комментария ниже)
Альтернативное решение выше было бы определить свой собственный протокол с реализацией по умолчанию sign()
, так что все типы в соответствии с этим протоколом будет иметь доступ к этому методу sign()
.
protocol Signable {
init()
func <(lhs:Self, rhs:Self) -> Bool
}
extension Signable {
func sign() -> Int {
return (self < Self() ? -1 : 1)
}
}
/* extend signed integer types to Signable */
extension Int: Signable { } // already have < and init() functions, OK
extension Int8 : Signable { } // ...
extension Int16 : Signable { }
extension Int32 : Signable { }
extension Int64 : Signable { }
/* extend floating point types to Signable */
extension Double : Signable { }
extension Float : Signable { }
extension CGFloat : Signable { }
/* example usage */
let foo = -4.2
let bar = 42
foo.sign() // -1 (Int)
bar.sign() // 1 (Int)
Так что интересно было то, что я * не * сходит с ума, есть на самом деле не что-нибудь * точно *, как это. Очень неожиданно. –