You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:45:08