2017-09-04 76 views
0

我想从函数的竞争中获取变量,并将其变成全局变量。这是我打电话的功能:Swift从函数完成中获取值并将其设置为全局变量

func getJsonFromUrl(name: String, completion: @escaping (String?)->()) { 
//use name variable just as you would in a normal function 
let URL2 = "https://url.com/asd.php" 
let url = URL(string: URL2) 
URLSession.shared.dataTask(with:url!) { (data, response, error) in 
    if error != nil { 
     print(error as Any) 
     completion(nil) 
    } else { 
     do { 
      guard let parsedData = try JSONSerialization.jsonObject(with: data!) as? [String:Any] else { completion(nil); return } 
      guard let ips = parsedData["ip"] as? String else {completion(nil); return } 
      print("The IP is: " + ips) //Prints the value correctly 
      completion(ips) 
     } catch let error as NSError { 
      print(error) 
      completion(nil) 
     } 
    } 
}.resume() 
} 

这是我怎么称呼它:

getJsonFromUrl(name: "Bob", completion: { ips in 
      print(ips) 
     }) 

不过,我想从那里我就打电话给一个全局变量转IPS。目前,我有ViewController中陈述之外的变量叫做IP2,这是我尝试设置变量:

getJsonFromUrl(name: "Bob", completion: { ips in 
      print(ips) 
      ip2 = ips! 
     }) 

而且它不设置IP2到IPS的价值。你怎么能这样做?

回答

0

我觉得问题是因为URLSession是异步任务。试试这个它可能可以帮助:

改变你的方式定义ip2变量是这样的:

var ip2 : String = "" { 
    didSet { 
     //Do something when ip2 get the value 
    } 
} 
+0

所以不是'VAR IP2 = “”'我把'VAR IP2:字符串= “”{didSet { }}'? – FrankFabregat

+0

是的,试试这个。我不确定,但它可能会帮助您 –

+0

以及我在didSet {}部分放置了什么? @TungVuDuc – FrankFabregat

相关问题