我是斯威夫特的初学者,如果这不太合理,请告诉我,但是我有一个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”的内容,而不必使用“how would be go to do this”中的“broadservice.sharedinstance.fetchbroadcasts{(games

最佳答案

你不应该使用全局变量,我认为这在任何语言中都不是推荐的。
现在你有了一个看起来像单点类(BroadService)的东西,这很好,因为它是一个很好的解决方案。
接下来,您需要做的就是向该类添加一个属性。假设videoLink是一个字符串,您可以将一个字符串属性添加到BroadService,例如storedVideoLink作为一个可选字符串,下次您需要在已经获取该值之后获取该值时,您可以这样访问它:BroadService.sharedInstance.storedVideoLink
还有一件事,要让BroadService作为一个单独的实例正常工作,您应该将其设置为私有的。
总而言之,我的建议是:

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

这样,它在同一个类中都保持了内聚性。您甚至可以为init添加getter方法,这样您就不必直接访问它了,在这个方法中,您可以声明如果字符串为nil,那么您可以提取数据,存储到字符串的链接,然后返回字符串。

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

10-13 08:58