【问题标题】:How to solve this Swift problem (AP CP Principles - Structures)如何解决这个 Swift 问题(AP CP 原则 - 结构)
【发布时间】: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,它应该在该函数中声明。始终在使用它们的范围内声明变量。

标签: swift for-loop struct


【解决方案1】:

由于是Array,您可以通过保存最长歌曲的索引来跟踪“最长歌曲”。

创建一个Int var 来保存索引。

遍历索引for n in 0..&lt;songs.count

如果songs[n]duration 大于songs[largestSongIdx]

然后相应地更新两者的longestSong 变量

【讨论】:

  • 非常感谢。现在这个问题看起来很简单。
  • 通常是这样。你在看什么书?
  • “开发 Swift AP CS 原则”是 Apple 官方课程的一部分(由 3 本书组成)。他们在今年早些时候更新了它。您可以在“图书”应用中免费找到这本书。
猜你喜欢
  • 2016-04-16
  • 2016-08-21
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 2012-10-30
  • 2019-04-20
相关资源
最近更新 更多