MIN ve MAX makroları için Swift eşdeğeri


99

C / Objective-C'de MIN ve MAX makrolarını kullanarak iki sayı arasındaki minimum ve maksimum değeri bulmak mümkündür. Swift, makroları desteklemiyor ve dil / temel kitaplıkta eşdeğerleri yok gibi görünüyor. Biri belki böyle jenerik dayanan, özel bir solüsyon ile gitmeli biri ?

Yanıtlar:


125

minve maxSwift'de zaten tanımlanmıştır:

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

Swift'deki belgelenmiş ve belgelenmemiş yerleşik işlevler hakkındaki bu harika yazıyı görün .


2
Afedersiniz. Bunu nasıl öğrendin Bunu 'Swift Programlama Dili'nde veya Xcode6 dokümantasyon aramasında göremiyorum.
GoZoner

7
@GoZoner Bazen bunu Xcode'a yazmanız ve Swift başlığına bakmanız gerekir. Eğer yazarsanız let a : Int = 5ve Command + Tıklayın Int, sen güzel şeyler görmek için olsun!
Jack

Vay be, sordum sevindim! En iyi a.ihtimalle, Xcode tamamlama olanakları arasında yazıyor ve geziniyordum ... ama 'Command + Click' bilet!
GoZoner

1
@GoZoner Otomatik Tamamlama da arama yapmak için harika bir yerdir! Maalesef şu anda Xcode 6 için çok riskli ...
Jack


36

Belirtildiği gibi, Swift sağlar maxve minişlev görür.

Bir örnek (Swift 2.x için güncellendi).

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 () 0 değerine sahiptir, bu nedenle sayılarınız negatifse bu işe yaramaz
eonist

1
maxNumber değerini isteğe bağlı yapabilir ve for döngüsünü bununla değiştirebilirsiniz: numbers.forEach {maxNumber = maxNumber! = nil? max (maxNumber!, $ 0): $ 0}
eonist

20

Swift 5 ile max(_:_:)ve min(_:_:)bir parçası olan Küresel Sayısal Fonksiyonlar . max(_:_:)aşağıdaki beyana sahiptir:

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

Bunu Ints ile şu şekilde kullanabilirsiniz :

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

Ayrıca, adında başka işlevler de olduğunu max(_:_:_:_:)ve min(_:_:_:_:)daha fazla parametreyi karşılaştırmanıza izin veren unutmayın. max(_:_:_:_:)aşağıdaki beyana sahiptir:

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

Bunu Floats ile şu şekilde kullanabilirsiniz :

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

Ancak Swift ile kullanım max(_:_:)ve kardeşlerini sayılarla sınırlı değilsiniz . Aslında bu fonksiyonlar geneldir ve uymasını herhangi bir parametre türünü kabul edebilir Comparableprotokol, bu olabilir String, Characterya da aramaları özel biri classveya struct.

Bu nedenle, aşağıdaki Playground örnek kodu mükemmel şekilde çalışır:

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"

Ayrıca, bir Array, a Set, a Dictionaryveya başka herhangi bir Comparableöğe dizisinin içindeki öğelerin min / maks öğesini almak istiyorsanız , max () veya min () yöntemlerini kullanabilirsiniz ( daha fazlası için bu Yığın Taşması yanıtına bakın) ayrıntılar).


1
Çok yardımcı oldu, teşekkürler! Şifreli bir başlık yerine aslında bir kullanım örneği verdiğiniz için yukarıdaki cevaptan çok daha iyi.
Cindeselia

14

SWIFT 4 Sözdizimi biraz değişti:

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

ve

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

Yani onu kullandığınızda bu örnekteki gibi yazmalısınız:

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

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

Yani 0'dan 100'e kadar olan değeri alırsınız, 0'ın altında veya 100'den yüksek olması önemli değil.


2
Eğer benim gibi XCode 9'da eğlenceli bir derleyici hatası alıyorsanız, max () ' Intın iki saniye geçmesine rağmen var olmadığını söyleyerek, Swift.max olarak değiştirin ve aniden yay, işler daha iyi. Teşekkürler wm.p1us!
xaphod

0

Bunu dene.

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.