এমআইএন এবং ম্যাক্স ম্যাক্রোগুলির জন্য স্যুইফ্ট সমতুল্য


99

সি / অবজেক্টিভ-সি তে এমআইএন এবং ম্যাক্স ম্যাক্রো ব্যবহার করে দুটি সংখ্যার মধ্যে সর্বনিম্ন এবং সর্বাধিক মান খুঁজে পাওয়া সম্ভব। সুইফ্ট ম্যাক্রোগুলিকে সমর্থন করে না এবং মনে হয় ভাষা / বেস লাইব্রেরিতে কোনও সমতুল্য নেই। এক একটি কাস্টম সমাধান সঙ্গে যেতে হবে, হয়তো ভালো জেনেরিক্স উপর ভিত্তি করে এক ?

উত্তর:


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

সুইফটে ডকুমেন্টেড এবং অননুমোদিত বিল্ট-ইন ফাংশনগুলিতে এই দুর্দান্ত রচনাটি দেখুন ।


4
দুঃখিত আপনি এটি কীভাবে শিখলেন? আমি এটিকে 'দ্য সুইফ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজে' বা কোনও এক্সকোড 6 ডকুমেন্টেশন অনুসন্ধানে দেখতে পাচ্ছি না।
GoZoner

7
@ গুজোনার কখনও কখনও আপনাকে এক্সকোডে টাইপ করতে হবে এবং সুইফ্ট শিরোনামটি পরীক্ষা করতে হবে। আপনি যদি টাইপ করেন let a : Int = 5এবং কমান্ড + ক্লিক করেন Int, আপনি দুর্দান্ত জিনিস দেখতে পাবেন!
জ্যাক

বাহ, খুশি আমি জিজ্ঞাসা! সর্বোপরি আমি টাইপ করতে a.এবং স্ক্রোল করে যাচ্ছিলাম এক্সকোড সমাপ্তির সম্ভাবনাগুলি দিয়ে ... তবে 'কমান্ড + ক্লিক' হচ্ছে টিকিট!
GoZoner

4
@ গুজোনার অটোকম্পলিটও অনুসন্ধানের এক দুর্দান্ত জায়গা! দুর্ভাগ্যক্রমে, এই মুহুর্তে এটি এক্সকোড 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

ইন্ট () এর মান 0 থাকে সুতরাং আপনার সংখ্যাগুলি নেতিবাচক থাকলে এটি কাজ করবে না

4
আপনি সর্বোচ্চ নম্বরটি optionচ্ছিক করতে পারেন এবং এর সাথে লুপটির জন্য প্রতিস্থাপন করতে পারেন: নম্বর.ফোর্স প্রতিটি {ম্যাক্সম্বার = ম্যাক্সবার্বার! = শূন্য? সর্বাধিক (সর্বোচ্চ সংখ্যা!, $ 0): $ 0}
ইওনিস্ট

20

সুইফ্ট 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, ক Set, ক Dictionaryবা অন্য কোনও অনুক্রমের মধ্যে ন্যূনতম / সর্বাধিক উপাদান পেতে চান তবে আপনি সর্বাধিক () বা ন্যূনতম () পদ্ধতিগুলি Comparableব্যবহার করতে পারেন ( এই স্ট্যাক ওভারফ্লো উত্তরটি আরও দেখুন বিশদ)।


4
খুব সহায়ক, ধন্যবাদ! উপরের উত্তরের চেয়ে অনেক ভাল কারণ আপনি প্রকৃতপক্ষে কোনও ক্রিপ্টিক শিরোনামের চেয়ে ব্যবহারের উদাহরণ দেন।
সিন্ডেসেলিয়া

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 এর নীচে কিনা তা বিবেচ্য নয়।


4
আপনি যদি আমার মতো এক্সকোড 9 এ একটি মজাদার সংকলক ত্রুটি পেয়ে যাচ্ছেন যে আপনি যখন দুটি স্পষ্টভাবে পাস করেছেন তখনও সর্বোচ্চ () উপস্থিত নেই Int, তবে এটিকে সুইফটম্যাক্সে পরিবর্তন করুন এবং হঠাৎ হ্যাঁ, জিনিসগুলি আরও ভাল। ধন্যবাদ wm.p1us!
xaphod

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.