arrays - 使用结构体、数组和用户默认值 (Swift)

标签 arrays swift struct uicollectionview nsuserdefaults

我正在使用 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/

相关文章:

php - 如何在不使用任何循环的情况下从 PHP 中的数组获取偶数键值

arrays - Rails 5 CarrierWave,无法删除多重上传中的最后一个文件

c++ - 'int [0]' c++ 的初始值设定项太多

swift - 扩展 UICollectionView 类的初始化器(Swift 3.2)

ios - 似乎每个 View Controller 都在创建我的结构的唯一实例——我不想要这样?

java - 如何使用两个整数数组执行 "cross-over"

ios - 自定义 MKAnnotation 标注 View ?

swift - dyld : Library not loaded: @rpath/libswiftDispatch. 动态库

c - 试图将一个 int 读入一个结构,但它返回一个段错误?

c - C中结构体数组的排序