2017-09-04 1 views
-1

웹 서버에있는 외부 JSON 파일에서 문자열을 가져 오려고하는데 성공적으로 가져옵니다.하지만 값을 가져 오는 클로저 안에 있습니다. 변수 returnip으로 반환 할 수 있도록 외부에 가져와야합니다. 어떻게해야합니까?클로저 내에 지정된 반환 변수 - Swift

func getJsonFromUrl() -> String { 

    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) 
     } else { 
      do { 

       let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:Any] 
       let ips = parsedData["ip"] as! String 
       print("The IP is: " + ips) //Prints the value correctly 
       var returnip = ips //The value that I want to return, that does not go outside this closure 
      } catch let error as NSError { 
       print(error) 
      } 
     } 

     }.resume() 
    return returnip //Does not return anything 
} 

감사

+0

당신은 이런 식으로 할 수 없습니다. 웹 호출은 비동기입니다. 반환은 URL 호출이 완료되기 전에 발생합니다. – ryantxr

답변

1

폐쇄는 폐쇄 자체에서 반환 안에 당신은 비동기 기능과 return 문에서 반환 할 수 없습니다.

대신 완성 처리기를 사용해야합니다. 또한 네트워크 응답을 구문 분석 할 때 옵션/강제 캐스팅 옵션의 강제 언랩을 사용하지 마십시오.

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: "Input", completion: { ips in 
    print(ips) 
    //you can only use the value inside the closure of completion 
}) 
+0

함수에 인수가 있으면 어떻게합니까? 예 :'func getJsonFromUrl (name : String, completion : @escaping (String?) ->()) {}'. 그게 기능을 만드는 방법이고, 어떻게 부르죠? – FrankFabregat

+0

BTW,'dataTask (with : URL)'이 백그라운드 대기열에서 실행 중입니다. 따라서 UI와 관련된 작업을 수행해야하는 경우 기본 대기열에서 수행하십시오. – antonio081014

+0

그건 그렇고, 나는 그것을 변수로 부르기 때문에, 'variable = getJsonFromUrl (name : name, completion : {ips in print (ips) }') '변수를 호출해야합니다. 그 맞습니까? – FrankFabregat

관련 문제