2017-07-02 10 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 
} 

は、今私は歌のために必要なパラメータをフェッチする機能を持っていると思います。曲はその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のように命名された定数を作成したいです。

誰も私がこれを解決する方法を知っていますか?または定数の名前をどうすればいいですか?私はXcodeの8/9で

をスウィフト3/3.1/4を使用していEDITあなた


をありがとう:

私はより良い私の問題を説明しようとするつもりです:

私は現在、サーバーから音楽をストリーミングするアプリケーションをプログラミングしています。ユーザーが再生したいトラックに関する情報を取得する必要があります。例えば、ユーザが曲「foo」を再生したい場合、アプリケーションは、曲のメタデータ、例えばアルバム「bar」、アーティスト「foobar」を解析する必要がある。これらのすべてのパラメータを含む "Song"という名前の構造体を作成しました。 したがって、ユーザーがソングをクリックすると、パーサーはメタデータを取得し、それを "Song"タイプの曲のUIDの後に付けられた定数に保存します。質問は、曲のUIDという名前で定数を宣言するにはどうすればいいですか? メタデータを基本的に取得する関数を作成しました。それは入力パラメータ "uid"を持っています。この関数は、要求されたトラックのストレージデータベースを検索するためにそのUIDを使用します。その後、私のデータベースに曲のUIDの名前を付けた子に格納されているメタデータをダウンロードします。

fetchSongWith(uid: "foobar") 

、それは曲のすべてのメタデータが含まれているタイプの「歌」の「foobarに」という名前の新しい定数を作成します。私はそのような関数を呼び出すことができるように。

これはどういうことか、それとも悪い習慣ですか?メタデータはどのように保存する必要がありますか?

ご迷惑をおかけして申し訳ありません。

+1

を助け

Song(uid: uid, title: "Lady GAGA") 

願っています! –

+0

これを達成する方法はないと考えてください。なぜあなたはこれをしたいのですか? – Lawliet

+0

申し訳ありません、質問を編集しました。ありがとう、結構です。 – wyte

答えて

0

すべてのものがトップレベルのソング構造になります。だから私の提案は、すべてを追跡し、構造体から始まり、あなたのUIDを別々に格納するのではなく、データを追加することです。 UIDはソングの一部なので、別途ストリングとして保存しないでください。

構造体に、オプションとデフォルト値を持つinitメソッドを追加します。それは曲のIDなので、UIDだけが必要です。曲はそれがなければ存在できません。しかし、必要に応じてコードを微調整してください。私はちょうどあなたにアイデアを与えています。

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 
    } 
} 

今すぐ、最初に言って、あなたは5曲のUIDを取得するためのAPI呼び出しを持っている、あなたは単にあなたがより多くのデータを取得したいときはいつでも、この

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の名前についてのより良い手がかりを得たいとしましょう。今、あなたが作る必要がある唯一の変更は、次のとおりです。すべてであなたの質問を取得していない

関連する問題