Сортировка массива по свойству эксемпляра

swift
xcode

#1

При прохождении курса “Гид по языку программирования Swift”, столкнулся с проблемой
конкретно : тест 8, вторая часть

К дополнению к первому заданию, создайте 4 объекта типа Student, поместите их в массив и отсортируйте по свойству mark по возрастанию. Выведите полученный результат на экран.

class Student {
var name : String
var surname : String
var yearOfBorn : Int
var mark : Double
init(name: String, surname : String, yearOfBorn : Int, mark : Double) {
    self.name = name
    self.surname = surname
    self.yearOfBorn = yearOfBorn
    self.mark = mark
}
}


var array: [Student] = [Student(name: "Steve", surname: "Sheley", yearOfBorn: 1989, mark: 4), 
Student(name: "Saimon", surname: "Thorn", yearOfBorn: 1988, mark: 2), 
Student(name: "Julie", surname: "Schlafs", yearOfBorn: 1989, mark: 1), 
Student(name: "Nguen", surname: "Dabsy", yearOfBorn: 1989, mark: 5)]

var newArray = array.sort(by: { $0.mark > $1.mark })

newArray

xcode выдаёт жёлтый треугольник с надписью “Variable ‘newArray’ inferred to have type ‘()’, wich may be unexpected”
А также сама сортировка не происходит
Подскажите, пожалуйста, может быть где-то очевидный пробел в моих знаниях.


#2

простоу удалите последнюю строку с переменной.
ругается из-за того, что она не является методом и нигде не используется.
а простой вызов переменной сам по себе ничего не делает.

либо сделайте так print(newArray)


#3

Ничего не происходит
ошибка не ушла, она возникает на строке:
var newArray = array.sort(by: { $0.mark > $1.mark })


#4

все, понял.
вызовите метод sorted вместо sort


#5

Ошибка ушла, но теперь в консоли это:

[__lldb_expr_10.Student, __lldb_expr_10.Student, __lldb_expr_10.Student, __lldb_expr_10.Student]

p.s. Ожидается сортировка по свойству mark


#6

попробуйте так:

let newArray = myArray
    .sorted { $0.mark < $1.mark }
    .map {$0.name}

#7

либо

print(newArray.map {$0.name})


#8

это помогло, спасибо!


#9

Добрый день! Подскажите, пожалуйста, есть ли идеи как вывести не просто один параметр (имя или оценка посредством запроса как .map {$0.name}), а два параметра из массива рядом (например имя - оценка вместе).


#10

map {$0.name + " - " + $0.mark}


#11

Спасибо! Для одного типа данных получилось. name который string и mark который double сцепить не согласился (“Binary operator ‘+’ cannot be applied to operands of type ‘String’ and ‘Double’”) но это уже другой вопрос.


#12

String + String(Double)


#13

Спасибо, получилось. Выглядит так:
print(newArray.map {$0.name + " - " + String($0.mark)})


#14

Не могли бы пояснить что происходит в этом выражении?
что такое $0 и $1?


#15

https://swiftbook.ru/content/languageguide/closures/