web-dev-qa-db-fra.com

Swift équivalent pour les macros MIN et MAX

En C/Objective-C, il est possible de trouver la valeur minimale et maximale entre deux nombres à l'aide de macros MIN et MAX. Swift ne supporte pas les macros et il semble qu'il n'y ait pas d'équivalent dans la bibliothèque language/base. Si vous utilisez une solution personnalisée, peut-être basée sur des génériques comme ceci n ?

92
mxb

min et max sont déjà définis dans Swift:

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

Voir ce grand article sur fonctions intégrées documentées et non documentées dans Swift .

119
Jack

Comme indiqué, Swift fournit les fonctions max et min.

Un exemple (mis à jour pour 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
34
Kyle Clegg

Avec Swift 5, max(_:_:) et min(_:_:) font partie de Fonctions numériques globales . max(_:_:) a la déclaration suivante:

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

Vous pouvez l'utiliser comme ceci avec Ints:

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

Notez également qu'il existe d'autres fonctions appelées max(_:_:_:_:) et min(_:_:_:_:) qui vous permet de comparer encore plus de paramètres. max(_:_:_:_:) a la déclaration suivante:

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

Vous pouvez l'utiliser comme ceci avec Floats:

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

Avec Swift, toutefois, vous n'êtes pas limité à utiliser max(_:_:) et ses frères avec des nombres. En fait, ces fonctions sont génériques et peuvent accepter tout type de paramètre conforme à Comparable protocole, que ce soit String, Character ou l’un de vos personnalités class ou struct.

Ainsi, l'exemple de code Playground suivant fonctionne parfaitement:

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"

De plus, si vous voulez obtenir l’élément min/max d’éléments contenus dans un Array, un Set, un Dictionary ou toute autre séquence de Comparable éléments, vous pouvez utiliser les méthodes max () ou min () (voir cette réponse de débordement de pile pour plus de détails).

18
Imanou Petit

Swift 4 La syntaxe a un peu changé:

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

et

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

Donc, quand vous l'utilisez, vous devriez écrire comme dans cet exemple:

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

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

Donc, vous obtenez la valeur de 0 à 100, peu importe si elle est inférieure à 0 ou supérieure à 100.

14
wm.p1us

Essaye ça.

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