C/Objective-Cでは、MINおよびMAXマクロを使用して2つの数値間の最小値と最大値を見つけることができます。 Swiftはマクロをサポートしておらず、言語/ベースライブラリには同等のものがないようです。おそらくこのようなジェネリックに基づいたカスタムソリューションを使用する必要があります one ?
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の文書化されたおよび文書化されていない組み込み関数 でこのすばらしい記事を参照してください。
指摘したように、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(_:_:)
および min(_:_:)
は Global Numeric Functions の一部です。 max(_:_:)
には次の宣言があります。
func max<T>(_ x: T, _ y: T) -> T where T : Comparable
Int
sで次のように使用できます。
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
Float
sで次のように使用できます。
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
、Set
、Dictionary
、またはComparable
要素のその他のシーケンス内にある要素のmin/max要素を取得する場合は、 max() または-を使用できます。 min() メソッド(詳細については このStack Overflowの回答 を参照)。
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())")