W.r.t. integrierte Funktionen, ich glaube, die nächstgelegene Sie Foundation
Methode ist die im Falle copysign(_: Double, _: Double) -> Double
let foo = -15.2
let sign = copysign(1.0, foo) // -1.0 (Double)
Natürlich benötigen eine Art Konvertierung Sie Double
auf eine Reihe von Art sind nicht in Betrieb erhalten werden.
Ich sehe jedoch keinen Grund, warum nicht Ihre eigene Erweiterung zu Ihren Bedürfnissen, speziell für eine so einfache Funktion wie sign
, wie sie nicht aufgebläht, z.
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)
}
}
(hier ergibt 1
auch für 0
, wie im Beispiel in Ihrer Frage).
(Bearbeiten im Hinblick auf Ihren Kommentar unten)
Eine alternative Lösung für die oben wäre ein eigenes Protokoll mit einer Standardimplementierung von sign()
, zu definieren, so dass alle Arten zu diesem Protokoll entsprechen hätte Zugang zu dieser sign()
Methode.
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)
Was war interessant, dass ich * nicht * war verrückt zu werden, gibt es etwas nicht wirklich * genau * wie diese. Sehr überraschend. –