我是斯威夫特的初学者,如果这不太合理,请告诉我,但是我有一个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/