MIN और MAX मैक्रोज़ के बराबर स्विफ्ट


98

C / ऑब्जेक्टिव-सी में MIN और MAX मैक्रोज़ का उपयोग करके दो नंबरों के बीच न्यूनतम और अधिकतम मूल्य का पता लगाना संभव है। स्विफ्ट मैक्रोज़ का समर्थन नहीं करता है और ऐसा लगता है कि भाषा / आधार पुस्तकालय में कोई समकक्ष नहीं हैं। एक एक कस्टम समाधान के साथ जाना चाहिए, हो सकता है इस तरह जेनरिक के आधार पर एक ?

जवाबों:


125

minऔर maxस्विफ्ट में पहले से ही परिभाषित हैं:

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

स्विफ्ट में डॉक्यूमेंटेड और अनकम्फर्टेबल बिल्ट-इन फंक्शन्स पर इस बेहतरीन राइटअप को देखें ।


2
माफ़ करना। आपने यह कैसे सीखा? मैं इसे 'द स्विफ्ट प्रोग्रामिंग लैंग्वेज' में नहीं देखता और न ही Xcode6 डॉक्यूमेंटेशन सर्च में।
गोजोनर

7
@GoZoner कभी-कभी आपको बस इसे Xcode में टाइप करना होगा और स्विफ्ट हेडर को देखना होगा। यदि आप टाइप करते हैं let a : Int = 5और कमांड + पर क्लिक करते हैं Int, तो आपको अच्छा सामान देखने को मिलता है!
जैक

वाह, खुशी है कि मैंने पूछा! सबसे अच्छा मैं टाइपिंग a.और पूर्णता संभावनाओं के माध्यम से स्क्रॉल कर रहा था ... लेकिन 'कमांड + क्लिक' टिकट है!
गोजोनियर

1
@GoZoner स्वतः पूर्ण भी खोज करने के लिए एक शानदार जगह है! दुर्भाग्य से, इस समय Xcode 6 के लिए इसकी बहुत जीत ...
जैक


36

जैसा कि बताया गया है, स्विफ्ट प्रदान करता है maxऔर minकार्य करता है।

एक उदाहरण (स्विफ्ट 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

Int () का मान 0 है इसलिए यदि आपके नंबर नकारात्मक हैं तो यह काम नहीं करेगा
eonist

1
आप maxNumber को वैकल्पिक बना सकते हैं और इसके लिए लूप को बदल सकते हैं: नंबर .forEach {maxNumber = maxNumber! =il! मैक्स (मैक्सनंबर ;, $ 0): $ 0}
एओनिस्ट

18

स्विफ्ट 5 के साथ, max(_:_:)और ग्लोबल न्यूमेरिक फंक्शंसmin(_:_:) का हिस्सा हैं । निम्नलिखित घोषणा है:max(_:_:)

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

आप इसे इस तरह से उपयोग कर सकते हैं Int:

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

यह भी ध्यान दें कि अन्य कार्य भी कहे जाते हैं max(_:_:_:_:)और min(_:_:_:_:)इससे आप और भी अधिक मापदंडों की तुलना कर सकते हैं। max(_:_:_:_:)निम्नलिखित घोषणा है:

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

आप इसे इस तरह से उपयोग कर सकते हैं Float:

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

हालाँकि स्विफ्ट के साथ, आप उपयोग करने के लिए सीमित नहीं हैं max(_:_:)और संख्याओं के साथ इसके भाई बहन। वास्तव में, वे कार्य सामान्य हैं और Comparableप्रोटोकॉल के अनुरूप किसी भी पैरामीटर प्रकार को स्वीकार कर सकते हैं , यह हो सकता है String, Characterया आपके किसी कस्टम classया struct

इस प्रकार, निम्नलिखित खेल का मैदान नमूना कोड पूरी तरह से काम करता है:

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"

इसके अलावा, यदि आप उन तत्वों का न्यूनतम / अधिकतम तत्व प्राप्त करना चाहते हैं जो तत्वों Array, a Set, Dictionaryया (या Comparableतत्वों के किसी अन्य अनुक्रम) के अंदर हैं, तो आप अधिकतम () या मिनट () विधियों का उपयोग कर सकते हैं (देखें इस ढेर अतिप्रवाह उत्तर के लिए और अधिक विवरण)।


1
बहुत मददगार, धन्यवाद! ऊपर दिए गए उत्तर से बहुत बेहतर है क्योंकि आप वास्तव में एक गुप्त हैडर के बजाय उपयोग का उदाहरण देते हैं।
सिंधेसिलिया

14

स्विफ्ट 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 से नीचे है तो कोई बात नहीं।


2
यदि आप मेरे जैसे XCode 9 में एक मजेदार कंपाइलर त्रुटि प्राप्त कर रहे हैं, तो यह कहना कि अधिकतम () तब भी मौजूद नहीं है जब आप इसे स्पष्ट रूप से दो Intएस पास करते हैं , फिर इसे Swift.max में बदल दें और अचानक yay, चीजें बेहतर हैं। धन्यवाद wm.p1us!
xaphod

0

इसे इस्तेमाल करे।

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.