【发布时间】:2020-12-12 14:30:50
【问题描述】:
我目前正在浏览 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)
【问题讨论】:
-
您应该使用一个变量来跟踪最长的歌曲,但您创建了一个属性
longest,因此恢复使用变量。var longest = songs[0]然后使用带范围的基本 for 循环 -
对您的更新的评论,因为您只在函数
lngstSongIndex中使用变量searchForLongestSong,它应该在该函数中声明。始终在使用它们的范围内声明变量。