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

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



답변

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의 문서화 및 문서화되지 않은 내장 함수에 대한이 훌륭한 글을 참조하십시오 .


답변

지적했듯이 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


답변

스위프트 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 () 메서드를 사용할 수 있습니다 (자세한 내용은 이 스택 오버플로 답변 참조). 세부).


답변

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 이상인지는 중요하지 않습니다.


답변

이 시도.

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


답변