【问题标题】:Parse JSON Result To UILabel in Swift在 Swift 中将 JSON 结果解析为 UILabel
【发布时间】:2020-11-25 17:20:12
【问题描述】:

我是 swift 的新手,目前正在通过一个项目来学习 API,该项目显示来自 rawg.io 的游戏列表,参考网站的 doc。我创建了 GameFeed.swiftGameDetail.swift 以从中提取名称、发布日期和评级,并在我的控制台中正常工作。

GameFeed.swift:

struct GameFeed: Codable {
    let results:[GameDetail]
}

GameDetail.swift :

struct GameDetail: Codable {
    let name:String
    let released:String
    let rating:Double
}

现在我正在尝试将结果放到一个简单的UIlabel 中,例如来自ViewController.swiftgameName.textgameReleased.textgameRating.text,因此它将显示在Main.Storyboard

我在谷歌上研究了如何通过使用DispatchQueue.main.async 向这些UIlabel 显示它,但是当我声明它时,它收到错误:

“GameFeed”类型的值没有成员“名称”

releasedrating 也发生了相同的错误消息。这是我的ViewController.Swift

class ViewController: UIViewController {
    @IBOutlet weak var gameName: UILabel!
    @IBOutlet weak var gameReleased: UILabel!
    @IBOutlet weak var gameRating: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Defining API Site
        let urlString = "https://api.rawg.io/api/games"
            let url = URL(string: urlString)
                guard url != nil else {
            return
        }
        
        // Calling API
        let session = URLSession.shared
            let dataTask = session.dataTask(with: url!){
                (data, response, error) in
            
                    if error == nil && data != nil {
                        let decoder = JSONDecoder()
                        do {
                            let gameFeed = try decoder.decode(GameFeed.self, from: data!)
                            print(gameFeed)
                            DispatchQueue.main.async {
                                self.gameName.text = gameFeed.name
                                self.gameReleased.text = gameFeed.released
                                self.gameRating.text = gameFeed.rating
                           }
                }
                        catch {
                            print("Error Parsing JSON")
                }
        }
        }
        dataTask.resume()
    }
}

我应该怎么做才能将数据解析为标签?

【问题讨论】:

    标签: ios json swift api get


    【解决方案1】:

    GameFeed 包含一个GameDetails 的数组。但是您正试图在这些标签上设置一个 GameDetail。您应该首先从该数组中提取一个 GameDetail,然后以您喜欢的方式分配它。

    DispatchQueue.main.async {
        let gameDetail = gameFeed.results.first // <- This will return the first one
        self.gameName.text = gameDetail?.name
        self.gameReleased.text = gameDetail?.released
        self.gameRating.text = gameDetail?.rating
    }
    

    【讨论】:

    • 谢谢,它现在显示在我的模拟器中。但它应该总是使用 optional 来显示价值吗?怎么可能不仅显示第一个?因为我未来的计划是要在动态视图表中声明它。这种方式还能用吗?
    • 我认为这是另一个问题,您应该在 搜索 UITableViewArrays 后问另一个问题 ;)
    • 哈哈是的,很抱歉跑题了。到目前为止,它目前已经回答了我的问题,并期待在下一步中弄清楚如何做到这一点。谢谢 Motjaba Hosseini。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多