Schnelles Äquivalent für MIN- und MAX-Makros

97

In C / Objective-C ist es möglich, den Minimal- und Maximalwert zwischen zwei Zahlen mithilfe von MIN- und MAX-Makros zu ermitteln. Swift unterstützt keine Makros und es scheint, dass die Sprach- / Basisbibliothek keine Entsprechungen enthält. Sollte man mit einer kundenspezifischen Lösung, vielleicht basierend auf Generika wie diese ein ?

mxb
quelle

Antworten:

124

minund maxsind bereits in Swift definiert:

func max<T : Comparable>(x: T, y: T, rest: T...) -> T
func min<T : Comparable>(x: T, y: T, rest: T...) -> T

Sehen Sie sich diese großartige Beschreibung dokumentierter und undokumentierter integrierter Funktionen in Swift an .

Jack
quelle
2
Es tut uns leid. Wie hast du das gelernt? Ich sehe es weder in 'The Swift Programming Language' noch in einer Xcode6-Dokumentationssuche.
GoZoner
7
@GoZoner Manchmal muss man es einfach in Xcode eingeben und den Swift-Header überprüfen. Wenn Sie tippen let a : Int = 5und Befehlstaste + Klicken auf Int, sehen Sie coole Sachen!
Jack
Wow, ich bin froh, dass ich gefragt habe! Bestenfalls hatte ich a.die Xcode-Vervollständigungsmöglichkeiten eingegeben und durchgeblättert ... aber 'Befehl + Klicken' ist das Ticket!
GoZoner
1
@GoZoner Autocomplete ist auch ein großartiger Ort zum Suchen! Leider ist es im Moment sehr wackelig für Xcode 6 ...
Jack
36

Wie bereits erwähnt, bietet Swift Funktionen maxund minFunktionen.

Ein Beispiel (aktualisiert für Swift 2.x).

let numbers = [ 1, 42, 5, 21 ]
var maxNumber = Int()

for number in numbers {
    maxNumber = max(maxNumber, number as Int)
}

print("the max number is \(maxNumber)")   // will be 42
Kyle Clegg
quelle
Int () hat den Wert 0, wenn Ihre Zahlen negativ sind, funktioniert dies nicht
eonist
1
Sie können die maxNumber optional machen und die for-Schleife durch folgende ersetzen: numbers.forEach {maxNumber = maxNumber! = nil? max (maxNumber !, $ 0): $ 0}
eonist
18

Mit Swift 5 max(_:_:)und min(_:_:)sind Teil der Global Numeric Functions . max(_:_:)hat die folgende Erklärung:

func max<T>(_ x: T, _ y: T) -> T where T : Comparable

Sie können es so verwenden mit Ints:

let maxInt = max(5, 12) // returns 12

Beachten Sie auch , dass es noch andere Funktionen aufgerufen max(_:_:_:_:)und min(_:_:_:_:)das ermöglicht es Ihnen , noch mehr Parameter zu vergleichen. max(_:_:_:_:)hat die folgende Erklärung:

func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Comparable

Sie können es so verwenden mit Floats:

let maxInt = max(12.0, 18.5, 21, 26, 32.9, 19.1) // returns 32.9

Mit Swift sind Sie jedoch nicht auf die Verwendung max(_:_:)und deren Geschwister mit Zahlen beschränkt. In der Tat sind diese Funktionen generisch und können jeden Parametertyp akzeptieren , dass Konform ComparableProtokoll, kann es sein String, Characteroder eine der benutzerdefinierten classoder struct.

Dabei funktioniert der folgende Playground-Beispielcode einwandfrei:

class Route: Comparable, CustomStringConvertible {

    let distance: Int
    var description: String {
        return "Route with distance: \(distance)"
    }

    init(distance: Int) {
        self.distance = distance
    }

    static func ==(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance == rhs.distance
    }

    static func <(lhs: Route, rhs: Route) -> Bool {
        return lhs.distance < rhs.distance
    }

}

let route1 = Route(distance: 4)
let route2 = Route(distance: 8)

let maxRoute = max(route1, route2)
print(maxRoute) // prints "Route with distance: 8"

Wenn Sie das min / max-Element von Elementen abrufen möchten, die sich in einer Array, a Set, a Dictionaryoder einer anderen Folge von ComparableElementen befinden, können Sie außerdem die Methoden max () oder min () verwenden ( weitere Informationen finden Sie in dieser Antwort zum Stapelüberlauf Einzelheiten).

Imanou Petit
quelle
1
Sehr hilfreich, danke! Viel besser als die obige Antwort, da Sie tatsächlich ein Anwendungsbeispiel anstelle eines kryptischen Headers angeben.
Cindeselia
14

SWIFT 4 Syntax etwas geändert:

public func max<T>(_ x: T, _ y: T) -> T where T : Comparable
public func min<T>(_ x: T, _ y: T) -> T where T : Comparable

und

public func max<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Comparable
public func min<T>(_ x: T, _ y: T, _ z: T, _ rest: T...) -> T where T : Comparable

Wenn Sie es verwenden, sollten Sie wie in diesem Beispiel schreiben:

let min = 0
let max = 100
let value = -1000

let currentValue = Swift.min(Swift.max(min, value), max)

Sie erhalten also den Wert von 0 bis 100, egal ob er unter 0 oder höher 100 liegt.

wm.p1us
quelle
2
Wenn Sie in XCode 9 wie mir einen lustigen Compilerfehler erhalten, der besagt, dass max () nicht existiert, selbst wenn Sie es eindeutig zwei IntSekunden übergeben, ändern Sie es in Swift.max und plötzlich sind die Dinge besser. Danke wm.p1us!
Xaphod
0

Versuche dies.

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
SaRaVaNaN DM
quelle