Equivalente Swift per le macro MIN e MAX


97

In C / Objective-C è possibile trovare il valore minimo e massimo tra due numeri utilizzando le macro MIN e MAX. Swift non supporta le macro e sembra che non ci siano equivalenti nella libreria di lingua / base. Se uno andare con una soluzione personalizzata, forse sulla base di farmaci generici come questo uno ?

Risposte:


124

mine maxsono già definiti in Swift:

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

Guarda questo fantastico articolo sulle funzioni integrate documentate e non documentate in Swift .


2
Scusate. Come l'hai imparato? Non lo vedo in "The Swift Programming Language" né in una ricerca nella documentazione di Xcode6.
GoZoner

7
@GoZoner A volte devi solo digitarlo in Xcode e controllare l'intestazione Swift. Se digiti let a : Int = 5e Comando + clic su Int, puoi vedere cose interessanti!
Jack

Wow, sono contento di averlo chiesto! Nella migliore delle ipotesi stavo digitando a.e scorrendo le possibilità di completamento di Xcode ... ma "Comando + clic" è il biglietto!
GoZoner

1
@GoZoner Autocomplete è anche un ottimo posto dove cercare! Sfortunatamente, al momento è molto instabile per Xcode 6 ...
Jack


36

Come sottolineato, Swift fornisce maxe minfunziona.

Un esempio (aggiornato per 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

Int () ha il valore di 0, quindi se i tuoi numeri sono negativi non funzionerà
eonista

1
potresti rendere il maxNumber opzionale e sostituire il ciclo for con questo: numbers.forEach {maxNumber = maxNumber! = nil? max (maxNumber!, $ 0): $ 0}
eonista

18

Con Swift 5, max(_:_:)e min(_:_:)fanno parte delle funzioni numeriche globali . max(_:_:)ha la seguente dichiarazione:

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

Puoi usarlo in questo modo con Ints:

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

Nota anche che ci sono altre funzioni chiamate max(_:_:_:_:)e min(_:_:_:_:)che ti permettono di confrontare ancora più parametri. max(_:_:_:_:)ha la seguente dichiarazione:

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

Puoi usarlo in questo modo con Floats:

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

Con Swift, tuttavia, non sei limitato all'uso max(_:_:)e ai suoi fratelli con i numeri. In effetti, queste funzioni sono generiche e possono accettare qualsiasi tipo di parametro conforme al Comparableprotocollo, che sia String, Charactero uno dei tuoi file classo struct.

Pertanto, il seguente codice di esempio Playground funziona perfettamente:

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"

Inoltre, se si desidera ottenere l'elemento min / max di elementi che si trovano all'interno di una Array, a Set, a Dictionaryo qualsiasi altra sequenza di Comparableelementi, è possibile utilizzare i metodi max () o min () (vedere questa risposta di Stack Overflow per ulteriori informazioni dettagli).


1
Molto utile, grazie! Molto meglio della risposta sopra poiché in realtà fornisci un esempio di utilizzo, piuttosto che un'intestazione criptica.
Cindeselia

14

La sintassi di SWIFT 4 è leggermente cambiata:

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

e

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

Quindi quando lo usi dovresti scrivere come in questo esempio:

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

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

Quindi ottieni il valore da 0 a 100 non importa se è inferiore a 0 o superiore a 100.


2
Se ricevi un divertente errore del compilatore in XCode 9 come me, dicendo che max () non esiste anche quando gli passi chiaramente due Ints, quindi cambialo in Swift.max e improvvisamente yay, le cose vanno meglio. Grazie wm.p1us!
xaphod

0

Prova questo.

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.