[英]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.