繁体   English   中英

使用结构,数组和UserDefaults(Swift)

[英]Working With Structs, Arrays, and UserDefaults (Swift)

我正在使用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”,它将是一个布尔值。

        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的布尔值从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的教程。 您将使用liked属性将Song实体存储在Core Data中。

您不应该使用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(标题:“歌曲一标题”,艺术家:“歌曲一艺术家”,歌词:“”,喜欢:假),QueuePlayer.Song(标题:“歌曲二标题”,艺术家:“ “ Song Two Artist”,歌词:“ Song Two Lyrics”,喜欢:false),QueuePlayer.Song(标题:“ Song Three Title”,艺术家:“ Song Three Artist”,歌词:“”,喜欢:false)])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM