2014-06-12 15 views
88

Trong C/Objective-C, bạn có thể tìm giá trị tối thiểu và tối đa giữa hai số sử dụng các macro MIN và MAX. Swift không hỗ trợ các macro và có vẻ như không có sự tương đương trong thư viện ngôn ngữ/cơ sở. 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 one?Tương đương Swift cho các macro MIN và MAX

Trả lời

118

minmax đã quy định tại Swift:

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

Xem writeup tuyệt vời này trên documented & undocumented built-in functions in Swift.

+2

Xin lỗi. Làm sao 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

+6

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

+0

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

30

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

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 
+0

Int() có giá trị 0 vì vậy nếu số của bạn là số âm này sẽ không hoạt động – eonist

+0

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

15

Với Swift, minmax là một phần của Swift Standard Library Functions Reference.

max(_:_:) có khai báo như sau:

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

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

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

Có một chức năng thứ hai gọi là max(_:_:_:_:) cho phép bạn so sánh nhiều hơn thông số. max(_:_:_:_:) mất một variadic parameter và có khai báo như sau:

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

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

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

Tuy nhiên, với Swift, bạn sẽ không bị hạn chế sử dụng max(_:_:), max(_:_:_:_:) và các đối tác min của chúng tôi với Int, Float hoặc Double. Trên thực tế, các chức năng đó là chung và có thể chấp nhận bất kỳ loại thông số nào tuân theo giao thức Comparable, có thể là String, Character hoặc một trong các tùy chỉnh class hoặc struct của bạn. Qua đó, các mã Sân chơi sau hoạt động hoàn hảo:

let maxString = max("Car", "Boat") // returns "Car" (alphabetical order) 
class Route: Comparable, CustomStringConvertible { 

    let distance: Int 
    var description: String { return "Route with distance: \(distance)" } 

    init(distance: Int) { 
     self.distance = distance 
    } 

} 

func ==(lhs: Route, rhs: Route) -> Bool { 
    return lhs.distance == rhs.distance 
} 

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 để có được những yếu tố tối đa các yếu tố đó là bên trong một Array, một Set, một Dictionary hoặc bất kỳ khác trình tự, bạn có thể sử dụng các phương thức maxElement() hoặc maxElement(_:). Xem this Stack Overflow answer để biết thêm chi tiết.

0

Hãy thử điều này.

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

SWIFT 4 Cú pháp 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 hoặc cao hơn 100.

+0

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

Các vấn đề liên quan