json - Swift 全局变量

标签 json swift swift4

我是 Swift 的初学者,所以如果这不太有意义,请告诉我,但我有一个 JSON 文件,我可以快速访问它并解析为数组,从那里我可以从数组并将其存储在 var 中。我希望能够全局访问这个变量,但我不知道如何做到这一点。

在另一个用户“rmaddy”的帮助下。我有这个代码:

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 {
    let game = games[indexPath]
    let videoLink = game.videoLink

}

我希望能够在全局范围内访问“videoLink”的内容,而不必使用“BroadService.sharedInstance.fetchBroadcasts {(游戏)”,我将如何做到这一点

最佳答案

你不应该使用全局变量,我认为任何语言都不建议这样做。

现在你有了看起来像 Singleton 类 (BroadService) 的东西,这很好,因为它是你正在寻找的一个很好的解决方案。

接下来您需要做的就是向该类添加一个属性。假设 videoLink 是一个字符串,您可以向 BroadService 添加一个字符串属性,例如 storedVideoLink 作为可选字符串,下次您在获取该值后需要获取该值,您可以像这样访问它:BroadService.sharedInstance.storedVideoLink

还有一件事,要让 BroadService 作为单例正常工作,您应该将其 init 设为私有(private)。

总而言之,这就是我的建议:

class BroadService {
    static let sharedInstance = BroadService()
    var storedVideoLink: String?

    private init() {} // to ensure only this class can init itself

    func fetchBroadcasts(completion: @escaping ([Games]?) -> ()) {
        // your code here
    }
}

// somewhere else in your code:
BroadService.sharedInstance.fetchBroadcasts { (games) in
    if let games = games {
        let game = games[indexPath]
        let videoLink = game.videoLink
        BroadService.sharedInstance.storedVideoLink = videoLink
    }
}
// now you can access it from anywhere as
// BroadService.sharedInstance.storedVideoLink

这样,所有内容都在同一个类中保持凝聚力。您甚至可以为 storedVideoLink 添加一个 getter 方法,这样您就不必直接访问它,在这个方法中您可以声明,如果字符串为 nil,那么您将获取数据,并将链接存储到字符串,然后返回该字符串。

关于json - Swift 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48171941/

相关文章:

json - 框架 json-ld 文档以附加子项

json - Windows 终端选项卡快捷方式不起作用、类型不正确、预期对象

javascript - 在 Javascript/Node.Js 中按二维数组中的对象属性排序

ios - 为单个 ViewController/UIcollectionView 使用多个库

ios - 快速向左或向右滑动

swift - ReSwift 中间件加载初始状态

swift - 四舍五入到小数点后一位(舍去小数位)

ios - swift 中文本字段的前景色

javascript - 如何使用 AngularJS 从 JSON 获取子集

ios - Whatsapp 打开 url 代码打开 Boltt Health App 而不是 ios 中的 whatsapp