Swift yang setara untuk makro MIN dan MAX

97

Dalam C / Objective-C dimungkinkan untuk menemukan nilai minimum dan maksimum antara dua angka menggunakan makro MIN dan MAX. Swift tidak mendukung makro dan tampaknya tidak ada padanan dalam pustaka bahasa / dasar. Harus satu pergi dengan solusi kustom, mungkin didasarkan pada obat generik seperti ini satu ?

mxb
sumber

Jawaban:

124

mindan maxsudah ditentukan di Swift:

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

Lihat artikel bagus ini tentang fungsi bawaan yang terdokumentasi & tidak terdokumentasi di Swift .

Mendongkrak
sumber
2
Maaf. Bagaimana Anda mempelajari ini? Saya tidak melihatnya di 'The Swift Programming Language' atau di pencarian dokumentasi Xcode6.
GoZoner
7
@GoZoner Terkadang Anda hanya perlu mengetiknya di Xcode dan memeriksa header Swift. Jika Anda mengetik let a : Int = 5dan Command + Klik Int, Anda akan melihat hal-hal keren!
Jack
Wow, senang saya bertanya! Paling-paling saya telah mengetik a.dan menelusuri kemungkinan penyelesaian Xcode ... tetapi 'Command + Klik' adalah tiketnya!
GoZoner
1
@GoZoner Autocomplete adalah tempat yang bagus untuk mencari juga! Sayangnya, ini sangat miring untuk Xcode 6 saat ini ...
Jack
36

Seperti yang ditunjukkan, Swift menyediakan maxdan minfungsi.

Contoh (diperbarui untuk 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
Kyle Clegg
sumber
Int () memiliki nilai 0 jadi jika angka Anda negatif ini tidak akan berhasil
eonist
1
Anda dapat membuat maxNumber opsional dan mengganti loop for dengan ini: numbers.forEach {maxNumber = maxNumber! = nil? maks (maxNumber!, $ 0): $ 0}
eonist
18

Dengan Swift 5, max(_:_:)dan min(_:_:)merupakan bagian dari Fungsi Numerik Global . max(_:_:)memiliki deklarasi berikut:

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

Anda dapat menggunakannya seperti ini dengan Ints:

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

Perhatikan juga bahwa ada fungsi lain yang dipanggil max(_:_:_:_:)dan min(_:_:_:_:)memungkinkan Anda membandingkan lebih banyak parameter. max(_:_:_:_:)memiliki deklarasi berikut:

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

Anda dapat menggunakannya seperti ini dengan Floats:

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

Namun dengan Swift, Anda tidak dibatasi untuk menggunakan max(_:_:)dan saudara kandungnya dengan angka. Faktanya, fungsi tersebut bersifat umum dan dapat menerima jenis parameter apa pun yang sesuai dengan Comparableprotokol, mungkin saja String, Characteratau salah satu dari kebiasaan Anda classatau struct.

Dengan demikian, kode contoh Playground berikut berfungsi dengan sempurna:

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"

Selain itu, jika Anda ingin mendapatkan elemen min / max elemen yang ada di dalam rangkaian elemen, Arraya, a Set, Dictionaryatau lainnya Comparable, Anda dapat menggunakan metode max () atau min () (lihat jawaban Stack Overflow ini untuk informasi selengkapnya detail).

Imanou Petit
sumber
1
Sangat membantu, terima kasih! Jauh lebih baik daripada jawaban di atas karena Anda benar-benar memberikan contoh penggunaan, daripada tajuk samar.
Cindeselia
14

Sintaks SWIFT 4 berubah sedikit:

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

dan

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

Jadi ketika Anda menggunakannya Anda harus menulis seperti pada contoh ini:

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

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

Jadi Anda mendapatkan nilai dari 0 hingga 100 tidak masalah jika di bawah 0 atau lebih tinggi 100.

wm.p1us
sumber
2
Jika Anda mendapatkan kesalahan kompiler yang menyenangkan di XCode 9 seperti saya, mengatakan bahwa max () tidak ada bahkan ketika Anda meneruskannya dengan jelas dua Intdetik, lalu ubah ke Swift.max dan tiba-tiba ya, semuanya menjadi lebih baik. Terima kasih wm.p1us!
xaphod
0

Coba ini.

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