我是 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/