2016-12-26 2 views
-1

Используя пример отсюда How to find the max value in a Swift object array?, как вы возвращаете элемент Usr, а не значение Int age?Как вернуть максимальный элемент в массив?

class Usr { 
    var age: Int 

    init(_ age: Int) { 
     self.age = age 
    } 
} 

let users = [Usr(1), Usr(8), Usr(5)] 

let maxAge = users.map{$0.age}.max() //this returns 8 instead of the instance 
+0

Используйте там Сопоставимый протокол для работы с пользователем. Затем вы можете использовать 'users.max()' и он вернет желаемого пользователя. – Fogmeister

+2

Функция 'max' также может использовать собственный предикат для сравнения элементов - вы видели [этот ответ] (http://stackoverflow.com/a/41217004/2976878) на вопрос, с которым вы связались? Он вернет 'Usr' с максимальным возрастом, или' nil', если массив пуст. – Hamish

ответ

2

В Свифте есть много отличных способов сделать это. Быстрый и простой способ заключается в использовании reduce функции:

let users = [Usr(1), Usr(8), Usr(5)] 

let max: Usr = users.reduce(Usr(Int.min)) { 
    ($0.age > $1.age) ? $0 : $1 
} 

print(max.age) // 8 

Вы также можете сделать свой Usr соответствовать протоколу Comparable и использовать max() функцию:

extension Usr: Comparable {} 

func ==(lhs: Usr, rhs: Usr) -> Bool { 
    return lhs.age < rhs.age 
} 

func <(lhs: Usr, rhs: Usr) -> Bool { 
    return lhs.age < rhs.age 
} 

let maxUser = users.max() 

Конечно, вы можете также использовать более традиционный цикл, а также:

var maxUser = users[0] 
for user in users { 
    if user.age > maxUser.age { 
     maxUser = user 
    } 
} 
2

Там может быть короче вариантов, но это один из способов:

let maxAgeUser = users.reduce(users.first, { $0!.age > $1.age ? $0 : $1 }) 
+0

Вы можете заменить весь '$ 0! .Age> $ 1.age? $ 0: $ 1' с 'max ($ 0.age, $ 1.age)', чтобы сделать его еще короче. Таким образом, это будет 'let maxAgeUser = users.reduce (users.first, {max ($ 0.age, $ 1.age)})' – Nicholas714

Смежные вопросы