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.