Swift 实现点击按钮随机选取收藏歌曲的方法
现有代码核心问题
- 你写的
convenience init(random: Bool)逻辑错误:Swift便利构造器单次初始化流程仅能调用一次指定构造器,连续写三次self.init无法生成多首歌曲,也不满足语法要求。 - 没有维护统一的收藏歌曲数组作为数据源,没有可随机选取的对象集合自然无法实现随机逻辑。
解决方案
步骤1:修正Song类代码
移除错误的random便利构造器,优化相等判断逻辑:
import UIKit class Song: Equatable, Codable { var name: String var minutesOfSong: String? var artist: String? let dateCreated: Date let songKey: String init(name: String, artist: String?, minutesOfSong: String?) { self.name = name self.minutesOfSong = minutesOfSong self.artist = artist self.dateCreated = Date() self.songKey = UUID().uuidString } static func ==(lhs: Song, rhs: Song) -> Bool { // 直接用全局唯一的songKey判断相等,比对效率更高 return lhs.songKey == rhs.songKey } }
步骤2:在控制器中维护收藏歌曲数据源并实现随机逻辑
在你的交互页面对应的ViewController中定义收藏歌曲数组,按钮点击时调用系统randomElement()方法实现随机选取:
class PlayViewController: UIViewController { // 收藏歌曲数组,可根据你的实际业务替换为用户真实收藏的数据 var favoriteSongs: [Song] = [ Song(name: "Cinema", artist: "Skirllex", minutesOfSong: "5:07"), Song(name: "Songnumber1", artist: "Songnumber1", minutesOfSong: "Songnumber1"), Song(name: "Songnumber2", artist: "Songnumber2", minutesOfSong: "Songnumber2") // 其余歌曲直接追加到数组中即可 ] // 按钮点击响应方法,替换为你实际绑定的点击事件 @IBAction func tapRandomShowButton(_ sender: UIButton) { // 随机选取元素,做空判断处理数组为空的异常场景 guard let randomSong = favoriteSongs.randomElement() else { // 此处可添加无收藏歌曲的提示逻辑 return } // 替换为你原有的弹出展示歌曲的逻辑即可 print("随机歌曲:\(randomSong.name),歌手:\(randomSong.artist ?? "未知"),时长:\(randomSong.minutesOfSong ?? "未知")") } }
可选优化
如果需要避免连续两次抽取到同一首歌曲,可新增变量记录上一次选中的歌曲ID,重复时重新抽取即可。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

