#swift #for-loop #struct
#swift #для цикла #структура
Вопрос:
В настоящее время я просматриваю учебные пособия Apple и наткнулся на проблему, которую я не могу понять.
Существует структура:
struct Song {
let title: String
let artist: String
let duration: Int
var longestSong = false
}
и массив с 4 песнями, которые имеют разную продолжительность: 90, 200, 150, 440.
В книге предлагается добавить метод, который проверяет, длиннее ли одна песня, чем другая.
Итак, основываясь на предыдущем материале, я добавил следующий метод в свою структуру:
func isLongerThan(_ song: Song) -> Bool {
return duration > song.duration
}
}
Затем в книге предлагается использовать цикл, чтобы найти самую длинную песню в массиве и распечатать ее на консоли
(Подсказка: используйте переменную, чтобы отслеживать самую длинную песню и инициализировать ее первой в массиве.)
Итак, я придумал этот цикл:
for (index, _) in songs.enumerated() {
if index < songs.count-1{
if songs[index].isLongerThan(songs[index 1]){
songs[index].longestSong = true
print("(songs[index].title) is longer than (songs[index 1].title)")
}
} else {
if songs[songs.count-1].isLongerThan(songs[0]){
songs[songs.count-1].longestSong = true
print("(songs[songs.count-1].title) is longer than (songs[0].title)")
}
}
}
Следующий шаг — сравнить эти песни с переменной longestSong = true, пока не останется только одна песня. Но, на мой взгляд, это не очень хорошее решение.
Есть ли лучший и более элегантный способ решения этой проблемы?
UPD Кажется, что я неправильно прочитал инструкции и пошел не тем путем. С некоторой помощью мне удалось найти это решение:
func searchForLongestSong(songs: [Song]) {
var lngstSongIndex = 0
for song in 0..<songs.count {
if songs[song].duration > songs[lngstSongIndex].duration {
lngstSongIndex = song
}
}
print("The longst song is "(songs[lngstSongIndex].title)"")
}
searchForLongestSong(songs: songs)
Комментарии:
1. Предполагается, что вы должны использовать переменную для отслеживания самой длинной песни, но вместо этого вы создали свойство
longest
, поэтому вернитесь назад, чтобы вместо этого использовать переменную.var longest = songs[0]
а затем используйте базовый цикл for с диапазоном2. Комментарий к вашему обновлению, поскольку вы используете переменную только
lngstSongIndex
внутри функцииsearchForLongestSong
, она должна быть объявлена внутри этой функции. Всегда объявляйте свои переменные в той области, в которой вы их используете.
Ответ №1:
Поскольку это an Array
, вы можете отслеживать «самую длинную песню», сохраняя индекс самой длинной песни.
Создайте Int
var
, чтобы сохранить индекс.
Цикл по индексам for n in 0..<songs.count
если duration
оф songs[n]
больше, чем songs[largestSongIdx]
Затем longestSong
соответствующим образом обновите переменные для обоих
Комментарии:
1. Большое спасибо. Теперь эта проблема выглядит очень просто.
2. Обычно это так. Какую книгу вы читаете?
3. «Разработка в принципах Swift AP CS», которая является частью официальной учебной программы Apple (она состоит из 3 книг). Они обновили его ранее в этом году. Вы можете бесплатно найти эту книгу в приложении Books.