2017-09-04 4 views
0

저는 경쟁에서 변수를 가져 와서 전역 변수로 바꾸려고합니다.Swift가 함수 완성에서 값을 가져 와서 전역 변수로 설정합니다.

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

그러나, 내가 전역 변수로 호출 곳에서 IP를 설정하려면 :

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() 
} 

이 내가 그것을 호출하는 방법입니다 : 이것은 내가 전화 했어 기능입니다. 현재, 나는의 ViewController 외부에 명시된 변수가 IP2라는 있고, 이것은 내가 변수를 설정 시도하는 방법입니다

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

을 그리고 IPS의 값으로 IP2을 설정하지 않는 것. 어떻게 할 수 있니?

답변

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