2014-06-12 16 views
88

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 lingua/base. Si dovrebbe andare con una soluzione personalizzata, magari basata su generici come questo one?Equivalente Swift per i macro MIN e MAX

risposta

118

min e max sono già definite nella Swift:

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

vedere questo grande writeup su documented & undocumented built-in functions in Swift.

+2

Siamo spiacenti. Come l'hai imparato? Non lo vedo in 'The Swift Programming Language' né in una ricerca di documentazione Xcode6. – GoZoner

+6

@GoZoner A volte devi solo scriverlo su Xcode e controllare l'intestazione Swift. Se digiti 'let a: Int = 5' e Command + Click su' Int', puoi vedere cose interessanti! – Jack

+0

Wow, contento di averlo chiesto! Nel migliore dei casi stavo scrivendo "a" e scorrendo le possibilità di completamento di Xcode ... ma "Command + Click" è il biglietto! – GoZoner

30

Come indicato, Swift fornisce le funzioni max e min.

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 
+0

Int() ha il valore di 0 quindi se i tuoi numeri sono negativi questo non funzionerà – eonist

+0

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

15

Con Swift, min e max fanno parte della Swift Standard Library Functions Reference.

max(_:_:) ha la seguente dichiarazione:

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

è possibile utilizzarlo come questa con Int:

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

V'è una seconda funzione chiamata max(_:_:_:_:) che ti permette di confrontare ancora di più parametri. max(_:_:_:_:) prende un variadic parameter ed ha la seguente dichiarazione:

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

è possibile utilizzarlo come questa con Float:

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

Tuttavia, con Swift, non si è limitati ad usare max(_:_:), max(_:_:_:_:) e le loro controparti min con Int, Float o Double. Di fatto, tali funzioni sono generiche e possono accettare qualsiasi tipo di parametro conforme al protocollo Comparable, potrebbe essere String, Character o uno dei tuoi personalizzati class o struct. In tal modo, i seguenti codici Parco giochi funzionano perfettamente:

let maxString = max("Car", "Boat") // returns "Car" (alphabetical order) 
class Route: Comparable, CustomStringConvertible { 

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

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

} 

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

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 vuole ottenere l'elemento massimo di elementi che sono all'interno di un Array, un Set, un Dictionary o qualsiasi altro sequenza, è possibile utilizzare i metodi maxElement() o maxElement(_:). Vedi this Stack Overflow answer per maggiori dettagli.

0

Prova questo.

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

SWIFT 4 Sintassi cambiato un po ':

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 

Così, quando lo si utilizza si dovrebbe scrivere come in questo esempio:

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

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

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

+0

Se stai riscontrando un errore del compilatore in XCode 9 come me, affermando che max() non esiste anche se lo passi due 'Int ', quindi modificalo a Swift.max e improvvisamente yay, le cose vanno meglio. Grazie, wm.p1us! – xaphod