2017-07-02 55 views
0

我只是为我的应用编写了一个json解析器。它获取以其uid命名的特定对象的信息。该应用播放在线流媒体音乐。所以:使用参数名称创建一个var

我有一个结构:

struct Song : Decodable { 
    var uid: String 
    var album: Album 
    var artist: String 
    var artwork: Artwork 
    var ranking: Int 
    var title: String 
} 

现在我想有哪些获取必要的参数一首歌曲的功能。这首歌应该以其用户名命名。

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。

有谁知道我该如何解决这个问题?或者我应该如何命名常量?我使用的是斯威夫特3/3.1/4和Xcode 8/9

谢谢


编辑:

我要去尝试来形容我的问题更好:

我目前正在编程一个应用程序,它从服务器传输音乐。我需要获取关于用户想要播放的曲目的信息。例如,如果用户想播放歌曲“foo”,则该应用需要解析歌曲的元数据,例如专辑“栏”,艺术家“foobar”。我为所谓的“Song”创建了一个包含所有这些参数的结构。 因此,当用户点击歌曲时,解析器读取元数据并将其存储到以歌曲的“歌曲”类型的UID命名的常量中。问题是我该如何声明一个名称为歌曲UID的常量? 我创建了一个本质上提取元数据的函数。它有一个输入参数“uid”。该函数使用该UID在存储数据库中搜索所请求的轨道。之后,它下载存储在我的数据库中以该歌曲的UID命名的子级中的元数据。所以,我可以像调用该函数:

fetchSongWith(uid: "foobar") 

,并创建一个名为型“宋”的“foobar的”新常数,它包含了歌曲的所有元数据。

难道这是不是可能或者是一个坏习惯?我应该如何存储元数据?

我对此感到抱歉。

+1

没有得到你的问题了!提供更多清晰度 –

+0

不要以为有什么办法可以实现它。你为什么想这样做? – Lawliet

+0

对不起,我编辑了这个问题。不过谢谢你。 – wyte

回答

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") 

希望帮助