이 함수를 사용하여 currentWeather (currentWeather 유형)의 전역 변수를 수정하려고합니다.이 변수는 URL에서 검색 한 정보로 변수를 업데이트하고 해당 변수를 나타내는 bool을 반환합니다. 성공. 그러나 currentWeather는 여전히 nil이므로이 함수는 false를 반환합니다. 나는 dataTask가 비동기이며, 태스크가 어플리케이션과 평행 한 백그라운드에서 실행되고 있다는 것을 알고 있지만, 나는 이것을 달성하기 위해 무엇을 의미하는지 이해하지 못한다. do 블록 이후에 currentWeather를 업데이트 할 수 없기 때문에 날씨가 더 이상 블록을 종료 한 후에 인식되지 않습니다. 나는 "self.currentWeather"를 사용하려고 시도했으나 해결되지 않은 식별자라고 전했다. 아마도 함수가 글로벌이기도하고 "self"도 없기 때문일 것이다.글로벌 변수 내부 변경 수정 (Swift 4)
API 키를 가져 왔기 때문에 URL이 유효하지 않지만 예상대로 작동하며 CurrentWeather 구조체가 디코딩 가능합니다. 현재 인쇄중인 WindwinUnrapped도 일관되게 성공합니다.
나는 Stack Overflow와 Apple의 공식 문서를보고 내 질문에 대한 답변을 찾을 수 없었지만 아마도 충분히 철저하지 않았습니다. 이 질문이 중복되는 것이 유감입니다. 더 깊은 관련 독서 방향은 또한 높이 평가됩니다! 최고의 코딩 방법에 대한 적합성의 부족에 대해 사과드립니다 - 지금은 경험이별로 없습니다. 정말 고마워요!
func getCurrentWeather() -> Bool {
let jsonUrlString = "https://api.wunderground.com/api/KEY/conditions/q/\(state)/\(city).json"
guard let url = URL(string: jsonUrlString) else { return false }
URLSession.shared.dataTask(with: url) { (data, response, err) in
// check error/response
guard let data = data else { return }
do {
let weather = try JSONDecoder().decode(CurrentWeather.self, from: data)
currentWeather = weather
if let currentWeatherUnwrapped = currentWeather {
print(currentWeatherUnwrapped)
}
} catch let jsonErr {
print("Error serializing JSON: ", jsonErr)
}
// cannot update currentWeather here, as weather is local to do block
}.resume()
return currentWeather != nil
}
왜 부검을 반환합니까? bool을 반환하는 목적은 무엇입니까? UI를 업데이트하기 위해 서버에서 가져온 아들이 필요하지 않습니까 ?? –
이 시점에서 필자는 함수의 성공 여부를 확인하기 위해 bool 만 반환합니다. 나는 어제의 날씨와 오늘의 시간별 날씨를 얻기위한 비슷한 기능을 가지고 있으며, 세 가지 모두의 성공을 확인한 다음 이에 따라 UI를 업데이트하는 기능을 가지고 있습니다. 내가 무엇을 돌려 줄 것을 권하겠습니까? 감사! – Caleb
'Void'를 반환해야합니다. 이 함수는 결과에 대한 매개 변수와 선택적 오류가있는 클로저를 허용해야합니다. 이 함수는'guard '에서 던져 질 수도 있습니다. – Paulw11