创建一个名为参数

时间:2017-07-02 08:20:11

标签: swift variables constants

我只是为我的应用编写一个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”,其中包含该歌曲的所有元数据。

这可能是某种可能的,还是一种坏习惯?我应该如何存储元数据?

我很抱歉这个混乱。

1 个答案:

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

希望有所帮助