เทียบเท่าอย่างรวดเร็วสำหรับมาโคร MIN และ MAX


99

ใน C / Objective-C คุณสามารถค้นหาค่าต่ำสุดและสูงสุดระหว่างสองตัวเลขโดยใช้มาโคร MIN และ MAX Swift ไม่รองรับมาโครและดูเหมือนว่าจะไม่มีสิ่งที่เทียบเท่าในไลบรารีภาษา / ฐาน หนึ่งควรไปกับโซลูชันที่กำหนดเองอาจจะขึ้นอยู่กับข้อมูลทั่วไปเช่นนี้หนึ่ง ?

คำตอบ:


125

minและmaxถูกกำหนดไว้แล้วใน Swift:

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

ดู writeup ดีนี้ในการบันทึกและไม่มีเอกสารในตัวฟังก์ชั่นในสวิฟท์


2
ขออภัย. คุณเรียนรู้สิ่งนี้ได้อย่างไร? ฉันไม่เห็นมันใน 'The Swift Programming Language' หรือในการค้นหาเอกสาร Xcode6
GoZoner

7
@GoZoner บางครั้งคุณต้องพิมพ์ใน Xcode และตรวจสอบส่วนหัวของ Swift หากคุณพิมพ์let a : Int = 5และ Command + คลิกIntคุณจะได้เห็นสิ่งดีๆ!
แจ็ค

ว้าวดีใจที่ฉันถาม! อย่างดีที่สุดฉันได้พิมพ์a.และเลื่อนดูความเป็นไปได้ในการเติม Xcode ... แต่ 'Command + Click' คือตั๋ว!
GoZoner

1
@GoZoner การเติมข้อความอัตโนมัติเป็นสถานที่ที่ยอดเยี่ยมในการค้นหาเช่นกัน! น่าเสียดายที่ Xcode 6 มีความสามารถในการเล่นมากในขณะนี้ ...
แจ็ค


36

ตามที่ระบุไว้ 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

Int () มีค่าเป็น 0 ดังนั้นหากตัวเลขของคุณเป็นลบสิ่งนี้จะไม่ได้ผล
eonist

1
คุณสามารถทำให้ maxNumber เป็นทางเลือกและแทนที่ for loop ด้วยสิ่งนี้: numbers.forEach {maxNumber = maxNumber! = nil? สูงสุด (maxNumber!, $ 0): $ 0}
eonist

20

กับสวิฟท์ที่ 5 max(_:_:)และmin(_:_:)เป็นส่วนหนึ่งของฟังก์ชั่นทั่วโลกตัวเลข max(_:_:)มีประกาศดังต่อไปนี้:

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

คุณสามารถใช้สิ่งนี้กับInts:

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

คุณสามารถใช้สิ่งนี้กับFloats:

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

อย่างไรก็ตามด้วย Swift คุณไม่ จำกัด การใช้งานmax(_:_:)และพี่น้องที่มีตัวเลข ในความเป็นจริงผู้ที่มีฟังก์ชั่นทั่วไปและสามารถยอมรับพารามิเตอร์ชนิดใดที่สอดคล้องกับComparableโพรโทคอมันอาจจะเป็นString, Characterหรือหนึ่งในของคุณเองหรือclassstruct

ดังนั้นโค้ดตัวอย่าง Playground ต่อไปนี้จึงทำงานได้อย่างสมบูรณ์แบบ:

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องค์ประกอบคุณสามารถใช้max ()หรือนาที ()วิธีการ (ดูคำตอบนี้กองมากเกินมาก รายละเอียด).


1
มีประโยชน์มากขอบคุณ! ดีกว่าคำตอบข้างต้นมากเนื่องจากคุณให้ตัวอย่างการใช้งานจริงมากกว่าส่วนหัวที่เป็นความลับ
Cindeselia

14

SWIFT 4 Syntax เปลี่ยนไปเล็กน้อย:

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 เช่นฉันโดยบอกว่า max () ไม่มีอยู่แม้ว่าคุณจะผ่านไปสองIntวินาทีอย่างชัดเจนแล้วให้เปลี่ยนเป็น Swift.max และทันใดนั้นสิ่งต่างๆก็ดีขึ้น ขอบคุณ wm.p1us!
xaphod

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.