Как решить эту быструю проблему (принципы AP CP — структуры)

#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.