web-dev-qa-db-ja.com

Swift MINおよびMAXマクロと同等

C/Objective-Cでは、MINおよびMAXマクロを使用して2つの数値間の最小値と最大値を見つけることができます。 Swiftはマクロをサポートしておらず、言語/ベースライブラリには同等のものがないようです。おそらくこのようなジェネリックに基づいたカスタムソリューションを使用する必要があります one

92
mxb

minmaxはSwiftで既に定義されています:

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

Swiftの文書化されたおよび文書化されていない組み込み関数 でこのすばらしい記事を参照してください。

119
Jack

指摘したように、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
34
Kyle Clegg

Swift 5の場合、 max(_:_:) および min(_:_:)Global Numeric Functions の一部です。 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プロトコルに準拠する任意のパラメータータイプを受け入れることができます。これは、StringCharacter、またはカスタム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"

さらに、ArraySetDictionary、またはComparable要素のその他のシーケンス内にある要素のmin/max要素を取得する場合は、 max() または-を使用できます。 min() メソッド(詳細については このStack Overflowの回答 を参照)。

18
Imanou Petit

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以上であるかは関係ありません。

14
wm.p1us

これを試して。

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