MIN 및 MAX 매크로에 해당하는 Swift


97

C / Objective-C에서는 MIN 및 MAX 매크로를 사용하여 두 숫자 사이의 최소값과 최대 값을 찾을 수 있습니다. Swift는 매크로를 지원하지 않으며 언어 / 기본 라이브러리에 동등한 항목이없는 것 같습니다. 하나는 어쩌면이 같은 제네릭을 기반으로, 사용자 지정 솔루션으로 이동해야 하나 ?

답변:


124

min그리고 max이미 스위프트에 정의되어 있습니다 :

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

Swift의 문서화 및 문서화되지 않은 내장 함수에 대한이 훌륭한 글을 참조하십시오 .


2
죄송합니다. 이것을 어떻게 배웠습니까? 나는 'The Swift Programming Language'나 Xcode6 문서 검색에서 그것을 볼 수 없습니다.
GoZoner 2014-06-12

7
@GoZoner 때로는 Xcode에 입력하고 Swift 헤더를 확인해야합니다. 을 입력 let a : Int = 5하고 Command + 클릭 Int하면 멋진 내용을 볼 수 있습니다!
Jack

와, 물어봐서 기뻐요! 기껏 a.해야 Xcode 완성 가능성을 입력 하고 스크롤했지만 ... 'Command + Click'이 티켓입니다!
GoZoner

1
@GoZoner 자동 완성은 검색하기에 좋은 곳입니다! 안타깝게도 현재 Xcode 6의 경우 매우 불안정합니다 ...
Jack


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 루프를 다음과 같이 바꿀 수 있습니다. numbers.forEach {maxNumber = maxNumber! = nil? max (maxNumber
!,

18

스위프트 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또는 사용자 정의 중 하나 class또는 struct.

따라서 다음 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"

또한, Arraya Set, a Dictionary또는 기타 Comparable요소 시퀀스 내부에있는 요소의 최소 / 최대 요소를 얻으려면 max () 또는 min () 메서드를 사용할 수 있습니다 (자세한 내용은 이 스택 오버플로 답변 참조). 세부).


1
매우 도움이되었습니다, 감사합니다! 위의 답변보다 훨씬 낫습니다. 실제로는 암호 헤더가 아닌 사용 예제를 제공하기 때문입니다.
Cindeselia

14

SWIFT 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에서 재미있는 컴파일러 오류가 발생하면 2 Int초 를 명확하게 전달해 도 max ()가 존재하지 않는다고 말한 다음 Swift.max로 변경하고 갑자기 예, 상황이 더 좋습니다. 감사합니다 wm.p1us!
xaphod

0

이 시도.

    let numbers = [2, 3, 10, 9, 14, 6]  
    print("Max = \(numbers.maxElement()) Min = \(numbers.minElement())")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.