Com Swift 5, Array, assim como outros Sequenceobjectos conforme protocolo ( Dictionary, Set, etc), tem dois métodos de chamadas max()e max(by:)que o elemento de retorno máxima na sequência ou nilse a sequência está vazia.
# 1 Usando Arrayo max()método
Se o tipo de elemento dentro de seus conforma seqüência de Comparableprotocolo (que pode ser String, Float, Characterou um de sua classe personalizada ou struct), você vai ser capaz de usar max()que tem a seguinte declaração :
@warn_unqualified_access func max() -> Element?
Retorna o elemento máximo na sequência.
Os seguintes códigos do Playground são exibidos max():
let intMax = [12, 15, 6].max()
let stringMax = ["bike", "car", "boat"].max()
print(String(describing: intMax)) // prints: Optional(15)
print(String(describing: stringMax)) // prints: Optional("car")
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 routes = [
Route(distance: 20),
Route(distance: 30),
Route(distance: 10)
]
let maxRoute = routes.max()
print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30)
# 2 Usando Arrayo max(by:)método
Se o tipo de elemento dentro da sua sequência não Comparableestiver em conformidade com o protocolo, você precisará usar max(by:)a seguinte declaração :
@warn_unqualified_access func max(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element?
Retorna o elemento máximo na sequência, usando o predicado fornecido como comparação entre os elementos.
Os seguintes códigos do Playground são exibidos max(by:):
let dictionary = ["Boat" : 15, "Car" : 20, "Bike" : 40]
let keyMaxElement = dictionary.max(by: { (a, b) -> Bool in
return a.key < b.key
})
let valueMaxElement = dictionary.max(by: { (a, b) -> Bool in
return a.value < b.value
})
print(String(describing: keyMaxElement)) // prints: Optional(("Car", 20))
print(String(describing: valueMaxElement)) // prints: Optional(("Bike", 40))
class Route: CustomStringConvertible {
let distance: Int
var description: String { return "Route with distance: \(distance)" }
init(distance: Int) {
self.distance = distance
}
}
let routes = [
Route(distance: 20),
Route(distance: 30),
Route(distance: 10)
]
let maxRoute = routes.max(by: { (a, b) -> Bool in
return a.distance < b.distance
})
print(String(describing: maxRoute)) // prints: Optional(Route with distance: 30)