我只是为我的应用编写一个json解析器。它获取以其uid命名的特定对象的信息。该应用程序播放在线流媒体音乐。所以:
我有一个结构:
struct Song : Decodable {
var uid: String
var album: Album
var artist: String
var artwork: Artwork
var ranking: Int
var title: String
}
现在我想要一个获取歌曲必要参数的功能。这首歌应以其uid命名。
let someArtwork = Artwork(large: "someLink", medium: "someLink", small: "someLink")
let someAlbumUID = Album(uid: "someAlbumUID", artwork: someArtwork, title: "myAlbum", tracks: [0 : "someSongUID"])
func fetchSongWith(someSongUID: String) -> Song {
// fetch information here
let someSongUID = Song(uid: "someSongUID", album: someAlbumUID, artist: String, artwork: Artwork, ranking: Int, title: String)
return someSongUID
}
// App has a song with a myUID fetched
fetchSongWith(someSongUID: myUID)
包装起来: 我想创建一个常量,它被命名为歌曲的uid,它所拥有的信息。
有谁知道我怎么解决这个问题?或者我应该如何命名常数?我正在使用Swift 3 / 3.1 / 4和Xcode 8/9
谢谢
修改
我将尝试更好地描述我的问题:
我正在编写一个从服务器传输音乐的应用程序。我需要获取有关用户想要播放的曲目的信息。例如,如果用户想要播放歌曲“foo”,则app需要解析歌曲的元数据,例如专辑“bar”,艺术家“foobar”。我创建了一个名为“Song”的结构,其中包含所有这些参数。 因此,当用户点击歌曲时,解析器获取元数据并将其存储到以歌曲的“歌曲”类型的UID命名的常量中。问题是如何声明一个常量,名称是歌曲的UID? 我创建了一个基本上获取元数据的函数。它有一个输入参数“uid”。该函数使用该UID在存储数据库中搜索所请求的轨道。之后,它会下载存储在我的数据库中以歌曲的UID命名的子节点中的元数据。所以我可以这样调用函数:
fetchSongWith(uid: "foobar")
并创建一个名为“foobar”的新常量,其类型为“Song”,其中包含该歌曲的所有元数据。
这可能是某种可能的,还是一种坏习惯?我应该如何存储元数据?
我很抱歉这个混乱。
答案 0 :(得分:0)
你所有的东西最终都在顶级Song结构中。所以我的建议是,为了更好地跟踪所有内容,从结构开始并添加数据,而不是单独存储您的UID。 UID是歌曲的一部分,因此不应单独存储为字符串。
在您的结构中,添加一个带有可选和默认值的init方法。只需要UID,因为它是歌曲的ID,没有它就不能存在歌曲。根据需要调整代码。我只是给你一个主意。
struct Song : Decodable {
var uid: String
var album: Album?
var artist: String?
var artwork: Artwork?
var ranking: Int?
var title: String?
init(uid: String, album: Album? = nil, artist: String? = nil, artwork: Artwork? = nil, ranking: Int? = nil, title: String? = nil){
self.uid = uid,
self.album = album
//...keep doing
}
}
现在,开头说,你有一个API调用来获得5首歌曲的UID,你可以简单地做到这一点
for uid in uidArray {
songArray.append(Song(uid: uid))
}
每当您想要获取更多数据时,请在歌曲级别
进行func fetchSongWith(someSong: song) -> Song {
// fetch information here
song.album = "something"
song.ranking = 1
return song
}
这也将使未来的改变变得容易。现在假设你想要首先获取UID和sone名称,以便用户对sone名称有更好的线索。现在你需要做的唯一改变是:
Song(uid: uid, title: "Lady GAGA")
希望有所帮助