2017-07-02 59 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") 

希望幫助