Swift tương đương cho các macro MIN và MAX


97

Trong C / Objective-C, có thể tìm giá trị nhỏ nhất và lớn nhất giữa hai số bằng macro MIN và MAX. Swift không hỗ trợ macro và có vẻ như không có ngôn ngữ tương đương nào trong thư viện ngôn ngữ / cơ sở. Ta nên đi với một giải pháp tùy chỉnh, có thể dựa trên Generics như thế này một ?

Câu trả lời:


124

minmaxđã được định nghĩa trong Swift:

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

Xem bài viết tuyệt vời này về các hàm tích hợp có tài liệu và không có tài liệu trong Swift .


2
Lấy làm tiếc. Làm thế nào bạn học được điều này? Tôi không thấy nó trong 'Ngôn ngữ lập trình Swift' cũng như trong tìm kiếm tài liệu Xcode6.
GoZoner

7
@GoZoner Đôi khi bạn chỉ cần nhập nó vào Xcode và kiểm tra tiêu đề Swift. Nếu bạn gõ let a : Int = 5và nhấn Command + Click vào Int, bạn sẽ thấy những thứ hay ho!
Jack

Wow, rất vui vì tôi đã hỏi! Tốt nhất tôi đã gõ a.và cuộn qua các khả năng hoàn thành Xcode ... nhưng 'Command + Click' mới là vé!
GoZoner

1
@GoZoner Autocomplete cũng là một nơi tuyệt vời để tìm kiếm! Thật không may, rất rung rinh của nó đối với Xcode 6 vào lúc này ...
Jack


36

Như đã chỉ ra, Swift cung cấp maxvà các minchức năng.

Một ví dụ (được cập nhật cho 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 () có giá trị từ 0 vì vậy nếu số của bạn là tiêu cực này sẽ không làm việc
eonist

1
bạn có thể đặt maxNumber tùy chọn và thay thế vòng lặp for bằng: number.forEach {maxNumber = maxNumber! = nil? max (maxNumber !, $ 0): $ 0}
eonist

18

Với Swift 5 max(_:_:)min(_:_:)là một phần của Hàm số toàn cầu . max(_:_:)có khai báo sau:

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

Bạn có thể sử dụng nó như thế này với Ints:

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

Cũng lưu ý rằng có những hàm khác được gọi max(_:_:_:_:)min(_:_:_:_:)cho phép bạn so sánh nhiều tham số hơn nữa. max(_:_:_:_:)có khai báo sau:

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

Bạn có thể sử dụng nó như thế này với Floats:

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

Tuy nhiên, với Swift, bạn không bị giới hạn sử dụng max(_:_:)và các anh chị em của nó có số. Trên thực tế, những chức năng đó là chung chung và có thể chấp nhận bất kỳ loại tham số nào tuân theo Comparablegiao thức, có thể là String, Characterhoặc một trong những tùy chỉnh của bạn classhoặc struct.

Do đó, mã mẫu Playground sau hoạt động hoàn hảo:

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"

Hơn nữa, nếu bạn muốn nhận phần tử tối thiểu / tối đa của các phần tử bên trong một Array, a Set, a Dictionaryhoặc bất kỳ chuỗi Comparablephần tử nào khác , bạn có thể sử dụng phương thức max () hoặc min () (xem câu trả lời Tràn ngăn xếp này để biết thêm chi tiết).


1
Rất hữu ích, cảm ơn! Tốt hơn nhiều so với câu trả lời ở trên vì bạn thực sự đưa ra một ví dụ về cách sử dụng, thay vì một tiêu đề khó hiểu.
Cindeselia

14

Cú pháp SWIFT 4 đã thay đổi một chút:

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

Vì vậy, khi bạn sử dụng nó, bạn nên viết như trong ví dụ này:

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

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

Vì vậy, bạn nhận được giá trị từ 0 đến 100 không quan trọng nếu nó dưới 0 hay cao hơn 100.


2
Nếu bạn đang gặp lỗi trình biên dịch thú vị trong XCode 9 như tôi, nói rằng max () không tồn tại ngay cả khi bạn vượt qua nó rõ ràng hai Intgiây, thì hãy thay đổi nó thành Swift.max và đột nhiên, mọi thứ tốt hơn. Cảm ơn wm.p1us!
xaphod

0

Thử cái này.

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.