【发布时间】:2018-08-23 12:30:45
【问题描述】:
当我尝试为每个频道获取上一个和现在正在播放的歌曲时,我遇到了同样的错误。我认为我的 struct Root 和播放列表有问题,因为数据格式不正确。我正在使用 Swift 4 并尝试学习 JSON,但这很难。以前的结构与 Song 结构相同。如何解决我的错误?
我的代码现在看起来:
import UIKit
struct Root : Decodable {
let copyright : String
let channels : [Channel]
let pagination : Pagination
}
struct Channel : Decodable {
let image : String
let imagetemplate : String
let color : String
let tagline : String?
let siteurl : String
let id : Int
let url : URL?
let statkey : String?
let scheduleurl : String
let channeltype : String
let name : String
}
struct Pagination : Decodable {
let page, size, totalhits, totalpages : Int
let nextpage : URL
}
struct Playlist : Decodable{
let id : Int
let name :String
let prev : [previoussong]
let song : [Song]
}
struct previoussong : Decodable {
let title : String
let description : String
let artist : String
let composer :String
let conductor : String
let albumname : String
let recordlabel : String
let lyricist : String
let producer : String
let starttimeutc : String
let stopttimeutc : String
}
struct Song : Decodable {
let title : String
let description : String
let artist : String
let composer :String
let conductor : String
let albumname : String
let recordlabel : String
let lyricist : String
let producer : String
let starttimeutc : String
let stopttimeutc : String
}
import UIKit
class ViewController: UIViewController,UITableViewDataSource {
var auth = SPTAuth.defaultInstance()!
var session:SPTSession!
var loginUrl: URL?
var tests = [Channel]()
//var pl = [Playlist]()
var stationsName:String?
@IBOutlet weak var tableV: UITableView!
@IBOutlet weak var image: UIImageView!
@IBOutlet weak var statLabel: UILabel!
@IBOutlet weak var songLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
tableV.dataSource = self
downloadStations()
}
func downloadStations(){
let test2 = "http://api.sr.se/api/v2/channels?format=json"
let play = "http://api.sr.se/api/v2/playlists/rightnow?format=json"
let url = URL(string: test2)
URLSession.shared.dataTask(with: url!){ (data , response, error) in
do{
let root = try JSONDecoder().decode(Root.self, from: data!)
self.tests = root.channels
for eachStations in self.tests {
self.stationsName = eachStations.name
print(" " + self.stationsName!)
DispatchQueue.main.async {
self.tableV.reloadData()
}
}
}
catch{
print(error.localizedDescription)
}
}.resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tests.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style : .default, reuseIdentifier : nil)
cell.textLabel?.text = tests[indexPath.row].name
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
【问题讨论】:
-
错误是什么?
-
发布一个可以编译运行的代码示例。见How to create a Minimal, Complete, and Verifiable example。
-
我认为你提问的方式有问题。
-
当我尝试从api.sr.se/api/v2/playlists/rightnow?format=json 下载当前正在播放的歌曲时,我的 struct Root 中的数据格式不正确。
-
我尝试运行您的代码。第一个问题是它不能按原样编译,所以我不得不对如何编译它进行很多猜测。第二个问题是我没有得到你所说的错误。帮自己一个大忙:关注guidelines for posting questions,提供compiles, runs, and demonstrates the problem 的代码示例。您将更有可能获得帮助。