MINおよびMAXマクロに対応するSwift


97

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

回答:


124

minそしてmaxすでにSwiftで定義されています:

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

Swiftのドキュメント化された、およびドキュメント化されていない組み込み関数に関するこのすばらしい記事をご覧ください。


2
ごめんなさい。これをどのようにして学びましたか?「Swiftプログラミング言語」にもXcode6のドキュメント検索にも表示されません。
GoZoner 2014年

7
@GoZoner Xcodeに入力してSwiftヘッダーをチェックアウトする必要がある場合があります。タイプlet a : Int = 5してコマンド+クリックするとInt、クールなものが表示されます!
ジャック

わあ、聞いてよかった!せいぜいa.Xcode補完の可能性を入力してスクロールしていたのですが、「コマンド+クリック」がチケットです。
GoZoner 2014年

1
@GoZoner Autocompleteも検索に最適な場所です。現時点ではXcodeの6のために残念ながら、その非常にグラグラ...
ジャック


36

指摘したように、Swiftはとを提供maxminます。

例(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!、$ 0):$ 0}
eonist

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プロトコル、それはかもしれStringCharacterカスタムのまたは1つ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の要素は、使用することができます(最大)または()分を見る(メソッドこのスタックオーバーフローの答えを多くのため詳細)。


1
とても助かります、ありがとう!暗号化されたヘッダーではなく、実際に使用例を示すため、上記の答えよりもはるかに優れています。
シンデセリア2018年

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で楽しいコンパイラエラーが発生し、max()が2 Int秒を明確に渡しても存在しないというメッセージが表示された場合は、Swift.maxに変更していきます。ありがとうwm.p1us!
xaphod 2017年

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.