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

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/


#16

Тоже проходил это задание у меня вот как получилось:

import UIKit

//Ниже представлен класс, в теле этого класса создайте функцию, которая будет распечатывать параметры данного класса по конкретному объекту. Создайте такой объект класса Student, вызовите у него эту функцию и выведите результат на экран.

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

func letter() -> String {

return (“Hello, i am a student, my name is (name) and surname (surname), and i wos born in (yearOfBorn), my mark is (mark)”)

}

print(letter())

}

}

let studentOne = Student(name: “Ivan”, surname: “Ivanov”, yearOfBorn: 1988, mark: 4)

let studentTwo = Student(name: “Ian”, surname: “Ianov”, yearOfBorn: 1991, mark: 3)

let studentThree = Student(name: “Varya”, surname: “Salamatina”, yearOfBorn: 2021, mark: 5)

let studentFour = Student(name: “Olga”, surname: “Olgina”, yearOfBorn: 1979, mark: 2)

var array = [studentOne, studentTwo, studentThree, studentFour]

var array2 = [studentOne.mark, studentTwo.mark, studentThree.mark, studentFour.mark]

array2.sorted()

Можете, пожалуйста оценить, на сколько это “криво”), спасибо!


#17

Тоже сейчас прохожу этот тест. Я думаю, что если в будущем добавишь еще один элемент в массив, то сортировка уже будет не корректной