我正在使用 swift 创建一个 iOS 应用程序,用户可以在其中播放音乐。我已经创建了应用程序在 .swift
文件中提供的一个结构体和一个歌曲数组。
struct Song {
var title: String
var artist: String
var lyrics: String
}
var songs: [Song] = [
Song(title: Song One Title", artist: "Song One Artist", lyrics: ""),
Song(title: Song Two Title", artist: "Song Two Artist", lyrics: "Song Two Lyrics"),
Song(title: Song Three Title", artist: "Song Three Artist", lyrics: ""),
];
数组 songs
填充 UICollectionViewController
并且效果非常好!但是,我希望用户能够通过按按钮来喜欢歌曲。然后他们喜欢的所有歌曲都将位于另一个 UICollectionViewController 中。我一直在尝试多种方案,但到目前为止,所有方案都失败了。所以我决定来到这个社区寻求帮助。
这是我的一个想法。我将在结构中创建另一个变量 Song
,称为“liked”,它是一个 bool。
struct Song {
var title: String
var artist: String
var lyrics: String
var liked: Bool
}
var songs: [Song] = [
Song(title: Song One Title", artist: "Song One Artist", lyrics: "", liked: false),
Song(title: Song Two Title", artist: "Song Two Artist", lyrics: "Song Two Lyrics", liked: false),
Song(title: Song Three Title", artist: "Song Three Artist", lyrics: "", liked: false),
];
我想知道如何才能将用户喜欢的歌曲的 indexPath
的 bool 从 false 更改为 true?我还希望将其保存到 UserDefaults
中,以便用户下次访问该应用程序时,仍然喜欢以前的歌曲。最后,我想在 UICollectionViewController
中显示 bool liked
等于 true 的所有歌曲。
如果您有任何想法,如果您能分享出来那就太好了!非常感谢您的帮助!
最佳答案
我可以想到一些方法
保存喜欢的歌曲
您可以将所有喜欢的Song
对象保存到UserDefaults
中。为此,您需要添加一个将 Song
结构转换为 [String: Any]
(即属性列表)的方法。然后,您可以将此[String: Any]
保存到UserDefaults
。这样做的缺点是,当用户删除歌曲时,您必须将其从 UserDefaults
中删除。同步起来相当困难。
保存所有歌曲,过滤掉喜欢的歌曲
您不必像第一种方法那样说出所有歌曲,而是保存所有歌曲并像您尝试的那样添加一个 liked
属性。显然,您还需要一个方法将结构转换为 [String: Any]
。
存储喜欢的歌曲的索引
存储整个 Song
结构可能有点过头了。如果歌曲要保持相同的顺序并且不会插入或删除更多歌曲,那么您可以只存储喜欢的歌曲的索引。如果用户喜欢第一首和第三首歌曲,您可以将数组:[1, 3]
存储到UserDefualts
中。
核心数据
我认为这是 4 种方法中最好的方法。不过,设置核心数据堆栈可能会更困难。有很多教程讨论如何使用 Core Data。您将在核心数据中存储 Song
实体,并具有 liked
属性。
关于arrays - 使用结构体、数组和用户默认值 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47579085/