Standard-Weg, um "clamp" eine Zahl zwischen zwei Werte in Swift
Gegeben:
let a = 4.2
let b = -1.3
let c = 6.4
Ich möchte wissen, die einfachste, Swiftiest Weise zu spannen, diese Werte auf einen bestimmten Bereich, sagen 0...5
, so dass gilt:
a -> 4.2
b -> 0
c -> 5
Ich weiß, ich kann Folgendes tun:
let clamped = min(max(a, 0), 5)
Oder etwas wie:
let clamped = (a < 0) ? 0 : ((a > 5) ? 5 : a)
Aber ich Frage mich, ob es irgendwelche anderen Möglichkeiten, dies zu tun in der Swift—insbesondere, ich will wissen (und dokumentieren SO, da es nicht angezeigt zu sein, eine Frage zu Klemm-zahlen in Swift), ob es etwas gibt, in der Swift-standard-Bibliothek speziell für diesen Zweck.
Kann es nicht sein, und wenn ja, ist das auch eine Antwort, ich werde es gerne annehmen. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ClosedInterval Typ hat schon eine
Methode, die nimmt einen anderen Intervall als argument. Es ist ein
Vorschlag auf der Swift-Entwicklung mailing-Liste
hinzufügen eine andere Methode, die Klemmen ein einzelnen Wert, um das VORGEGEBENE Intervall:
und das ist genau das, was Sie brauchen.
Mit der Umsetzung der bestehenden
clamp()
Methode beials Beispiel, diese zusätzliche
clamp()
Methode umgesetzt werden können, wieBeispiel:
ClosedInterval
ist ein generic Typdaher funktioniert dies nicht nur für
Double
aber für alleArten, die
Comparable
(wieInt
,CGFloat
,String
, ...):Update für Swift 3 (Xcode 8):
ClosedInterval
umbenannt wurdezu
ClosedRange
, und seine Eigenschaften sindlower/upperBound
jetzt:..., x, y, z, å, ä, ö
),"ä" < "z" // true
ist ein bisschen verwirrend 😉 auf einer anderen Anmerkung, dieclamp
Beispiele aufgeführt werden, die benutzt werden müssen mit externen parameter namevalue
für den Swift 3-Beispiel, eventuell erwähnenswert explizit (oder Xcode Update, das wird prompt!)._
externen parameter-Namen, um die Beispiele funktionieren wieder. Vielen Dank für das feedback!Swift 4/5
Erweiterung der
Comparable/Strideable
ähnlichClosedRange.clamped(to:_) -> ClosedRange
von standard-Swift-Bibliothek.Verwendung:
Unter Verwendung der gleichen syntax wie die von Apple zu tun, die min-und max-operator:
Können Sie das:
Das tolle an diesem Ansatz ist, dass jeder Wert definiert die notwendige Art zu tun, die operation, so dass der compiler verarbeitet, das sich.
In Swift 3 gibt es neue
CountableClosedRange
,CountableRange
,Range
,ClosedRange
Protokolle. Sie haben die gleichenupperBound
undlowerBound
Eigenschaften. So können Sie verlängern alleRange
Protokolle auf einmal mit einemclamp
Methode durch die Deklaration einer benutzerdefinierten Protokoll:Verwendung:
(0..<100).clamp(123)
zurück100
die könnte unerwartet sein, da diese Zahl nicht in das Intervall eingeschlossen.Mit Swift 5.1, die idiomatischen Weg, um die gewünschte Klemmung wäre mit Eigenschaft Wrapper. Ein berührt-bis Beispiel von NSHipster:
Verwendung: