使用Structs,Arrays和UserDefaults(Swift)

时间:2017-11-30 17:17:29

标签: 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,称为“喜欢”,它将是一个布尔。

        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的所有歌曲。

如果您有任何想法,如果您可以分享它们会很棒!非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我可以想到一些方法

保存喜欢的歌曲

您可以将所有喜欢的Song个对象保存到UserDefaults。为此,您需要添加一个将Song结构转换为[String: Any]的方法,即属性列表。然后,您可以将此[String: Any]保存到UserDefaults。这样做的缺点是当用户删除歌曲时,您必须从UserDefaults删除它。同步它非常困难。

保存所有歌曲,过滤掉喜欢的歌曲

不是像第一种方法那样说出你所做的所有歌曲,而是保存所有歌曲,就像你尝试过的那样,添加一个liked属性。显然,您还需要一种方法将结构转换为[String: Any]

存储喜欢的歌曲的索引

存储整个Song结构可能有点矫枉过正。如果歌曲将保持相同的顺序并且不再插入或删除歌曲,那么您可以只存储喜欢的歌曲的索引。如果用户喜欢第一首和第三首歌曲,则将数组[1, 3]存储到UserDefualts

核心数据

我认为这是4中最好的方法。虽然设置核心数据栈可能更困难。有很多关于如何使用Core Data的教程。您将在核心数据中存储Song个实体,并具有liked属性。

答案 1 :(得分:1)

您不应将UserDefualts用于存储。将其编码并将其保存到json文件:

struct Song: Codable {
    let title: String
    let artist: String
    let lyrics: String
    var liked: Bool
}

struct Queue: Codable {
    var songs: [Song] = []
    var data: Data {
        return try! JSONEncoder().encode(self)
    }
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var queue = Queue()
        queue.songs = [
            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),

                ]
        let preferences = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!.appendingPathComponent("Preferences", isDirectory: true)
        let queueURL = preferences.appendingPathComponent("queue.json")
        try! queue.data.write(to: queueURL)
        let data = try! Data(contentsOf: queueURL)
        let loadedQueue = try! JSONDecoder().decode(Queue.self, from: data)
        print(loadedQueue)
    }
}

这将打印

  

Queue(歌曲:[QueuePlayer.Song(标题:“Song One Title”,艺术家:“Song One   艺术家“,歌词:”,“喜欢:假”,QueuePlayer.Song(标题:“歌曲二   标题“,艺术家:”歌曲二艺术家“,歌词:”歌曲二歌“,喜欢:   QueuePlayer.Song(标题:“歌曲三题”,艺术家:“宋三   艺术家“,歌词:”“,喜欢:假)])