【问题标题】:JSON Parsing in Swift 4Swift 4 中的 JSON 解析
【发布时间】:2018-01-09 00:07:19
【问题描述】:

我对 Swift 很陌生,我正在尝试从我解析的 JSON 数组中返回一个字符串。我不确定如何在另一个类中使用“arrayString”var,因为我没有在另一个类中“声明”它。我认为这与它在 URLSession 中有关。关于我可以做什么的任何提示?

struct Games: Decodable {
let videoLink: String
}
class BroadService: NSObject {
static let sharedInstance = BroadService()
func fetchBroadcasts(completion: @escaping ([Games]) -> ()) {
    let jsonUrlString = "LINK IS HERE."
    guard let url = URL(string: jsonUrlString) else { return }
    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else { return }
        do {
            let json = try JSONDecoder().decode([Games].self, from: data)
            let arrayString = (json[linkcell].videoLink)
        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }
        }.resume()
}

这是我目前的代码,它不是世界上最整洁的东西,但它可以完成工作。

【问题讨论】:

  • 当你说你在另一个课堂上使用这个有问题时,你是什么意思?在大多数情况下,它会导致类型出现问题,或者与隐式展开可选选项有关。你能扩展你遇到的问题吗?我假设'arrayString'是你想要返回的?
  • 是的,遇到问题是一种糟糕的表达方式,我现在重新编辑它。我的意思是我不知道如何在不同的类中使用这个变量,因为它告诉我我没有在其他类中声明它

标签: json swift nsurlsession swift4


【解决方案1】:

您的代码有几个问题:

  1. 你不必要地扩展NSObject
  2. 您永远不会调用completion 块。
  3. arrayString 不是数组。
  4. 您的完成块至少应使 Games 数组可选以指示错误。

你的代码应该是这样的:

struct Games: Decodable {
    let videoLink: String
}

class BroadService {
    static let sharedInstance = BroadService()

    func fetchBroadcasts(completion: @escaping ([Games]?) -> ()) {
        let jsonUrlString = "LINK IS HERE."
        guard let url = URL(string: jsonUrlString) else {
            completion(nil)
            return
        }

        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {
                completion(nil)
                return
            }

            do {
                let games = try JSONDecoder().decode([Games].self, from: data)
                completion(games)
            } catch let jsonErr {
                print("Error deserializing json:", jsonErr)
                completion(nil)
            }
        }.resume()
    }
}

那么你可以这样称呼它:

BroadService.sharedInstance.fetchBroadcasts { (games) in
    if let games = games {
        // Process all games if needed
        for game in games {
            let videoLink = game.videoLink
            // do something
        }

        // Or access a specific game:
        let game = games[someIndex]
        let videoLink = game.videoLink
        // do something
    }
}

【讨论】:

  • 谢谢,清理一切需要很长时间。无论如何我可以访问“BroadService.sharedInstance.fetchBroadcasts { (games) in”之外的“game”/“videoLink” var。不确定措辞是否正确。感谢您的所有帮助
  • 您必须至少在最初访问它,如我的回答所示。如果需要,您可以将games(或数组中的特定游戏)分配给一些更“永久”的存储,以便在其他代码中访问。
  • 非常感谢,对于“基本”问题的道歉,但你能告诉我该怎么做吗?如果没有,别担心,你是一个巨大的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多