programing

MIN 및 MAX 매크로에 대응하는 스위프트

easyjava 2023. 9. 26. 22:41
반응형

MIN 및 MAX 매크로에 대응하는 스위프트

C / Objective-C에서는 MIN과 MAX 매크로를 사용하여 두 숫자 사이의 최소값과 최대값을 찾을 수 있습니다.스위프트는 매크로를 지원하지 않으며 언어/베이스 라이브러리에 동등한 기능이 없는 것 같습니다.맞춤형 솔루션을 사용해야 하나요, 어쩌면 이런 제네릭을 기반으로 해야 하나요?

min그리고.maxSwift에 정의되어 있습니다.

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

다음과 같이 사용됩니다.

let min = min(1, 2)
let max = max(1, 2)

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

Swift 5와 함께, 는 전역 숫자 함수의 일부입니다.max(_:_:)에는 다음과 같은 선언이 있습니다.

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

이렇게 사용하시면 됩니다.Ints:

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

이 함수에는 더 많은 파라미터를 비교할 수 있는 다른 함수가 있습니다.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"

또한 내부에 있는 요소의 최소/최대 요소를 구하려면Array,aSet,aDictionary혹은 다른 어떤 순서의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]
let min = numbers.min()
let max = numbers.max()
print("Max = \(max) Min = \(min)")

언급URL : https://stackoverflow.com/questions/24186648/swift-equivalent-for-min-and-max-macros

반응형