Быстрый эквивалент для макросов MIN и MAX

В C/ Objective-C можно найти минимальное и максимальное значение между двумя числами, используя макросы MIN и MAX. Swift не поддерживает макросы и кажется, что в библиотеке языка/базы нет эквивалентов. Если вы идете с помощью специального решения, возможно, на основе таких дженериков, как один?

Ответ 2

Как указано, Swift предоставляет функции max и min.

Пример (обновлен для 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

Ответ 3

С Swift, min и max являются частью Справочник по функциям стандартных ссылок Swift.

max(_:_:) имеет следующее объявление:

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

Вы можете использовать его так: Int:

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

Существует вторая функция, называемая max(_:_:_:_:), которая позволяет сравнивать еще больше параметров. max(_:_:_:_:) принимает вариационный параметр и имеет следующее объявление:

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

Вы можете использовать его так: Float:

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

Однако с помощью Swift вы не ограничены использованием max(_:_:), max(_:_:_:_:) и их копий min с Int, Float или Double. Фактически эти функции являются общими и могут принимать любой тип параметра, который соответствует протоколу Comparable, может быть String, Character или один из ваших пользовательских class или struct. Таким образом, следующие коды площадки прекрасно работают:

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"

Кроме того, если вы хотите получить максимальный элемент элементов, который находится внутри Array, a Set, a Dictionary или любой другой последовательности, вы можете использовать maxElement() или методы maxElement (_:). Подробнее см. этот ответ.

Ответ 4

SWIFT 4 Синтаксис немного изменился:

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

и

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

Поэтому, когда вы его используете, вы должны написать, как в этом примере:

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

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

Итак, вы получаете значение от 0 до 100, не имеет значения, если оно ниже 0 или выше 100.

Ответ 5

Попробуйте это.

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