2017-02-22 2 views
3

좋아, 그래서 단지를 heres 내 코드를 시작합니다 API 호출. 나는 이것이 가장 신뢰할 수있는 방법이 아니라는 것을 알고 있지만, 나는 그것을 작동 시키려고 노력 중이다.'자기'

첫 번째 오류는 다음과 같습니다 라인에

'self' captured by a closure before all members were initialized

DarkSkyClient(apiKey: "").getForecast(latitude: Utils().getLat(), longitude: Utils().getLong()) { result in

내 두 번째 오류 :

Return from initializer without initializing all stored properties

두 번째에 분명히 내가 '지금

}을 마지막으로 오른쪽 초기화하지 않습니다. 나는 나의 최종 목표가하는 일을하는 적절한 방법을 찾을 수 없다. 어쩌면 내가 완전히 잘못하고있는 것일까 요?

+3

개체가 비동기 적으로 자체를 초기화 할 수 없습니다. API 호출은 다른 객체에 의해 호출되어야합니다.이 객체는'Weather' 클래스의 초기화 프로그램을 호출하고 API에서 가져온 값을 전달해야합니다. – dan

+0

@dan 나는 그 부분을 이해한다. 나는 이것을하기위한 적절한 방법이 다른 목적과 무엇인지 이해하지 못한다. (또한 도움 주셔서 감사합니다) –

+0

당신은 멤버 변수를 Optionals로 선언 할 수 있습니다 – odlund

답변

2

내가 좋겠 (이 그들이 비 선택적 항목된다는 뜻) 선택적 항목으로 속성을 선언하거나 디폴트 값을 초기화 옵션이 위험성으로 인해 동시성 문제가 발생하고 있음을 짐작할 수 있습니다. DarkSkyClient에 대한 비동기 호출이 반환되기 전에 객체의 속성에 액세스하려고 시도하고있을 수 있습니다. 이봐,이 0이다 - 즉, 사건의 순서는 ...

  1. 날씨 객체가 DarkSkyClient을 시작하기에 0
  2. 전화에 온도를 설정, 초기화,
  3. 읽기 임시 변수가 백그라운드에서 실행!
  4. DarkSkyClient 호출이 완료되면 임시 값을 원하는 값으로 설정합니다. 당신이 그것을 가치가 비동기 API와 개발에 익숙하지 않은 당신의 동안이 위로 읽을 경우

    class Weather { 
        var temp: Float 
        var condition: String 
        var wind: Float 
        var precip: Float 
    
        init(forecast: Forecast) { 
         temp = (forecast.currently?.temperature)! 
         condition = (forecast.currently?.summary)! 
         wind = (forecast.currently?.windSpeed)! 
         precip = (forecast.currently?.precipitationProbability)! 
        } 
    
        static func getWeather() { 
         DarkSkyClient(apiKey: "<api key>").getForecast(latitude: Utils().getLat(), longitude: Utils().getLong()) { result in 
    
          switch result { 
          case .success(let currentForecast, _): 
           let weather = Weather(forecast: currentForecast) 
           // Display the weather somewhere 
           doSomethingWith(weather: weather) 
          case .failure(let error): 
           print(error) 
          } 
         } 
        }  
    } 
    

    : 나쁜

그래서 당신이 정말로 무엇을해야하는지 제어 패턴의 반전에 스위치입니다 제목; 그것은 매우 까다로울 수 있습니다 (슬프게도, 좋은 입문서에 대한 추천이 없습니다). 희망이 도움이됩니다!

+0

옵션 init()도 같은 문제를 일으키는 이유는 무엇입니까? – Retro

+0

코드가 컴파일되지 않아도 동시성 문제가 발생할 수 있음을 설명해주십시오. – gnasher729

3

당신은

var temp: Float? 
var condition: String? 
var wind: Float? 
var precip: Float? 

또는

var temp: Float=0 
var condition: String="" 
var wind: Float=0 
var precip: Float=0 
+1

두 번째 옵션에서 '0'을 모두 '0.0'으로 변경하고 모든 명시 적 타입 선언을 제거 할 수 있습니다. – rmaddy

+1

@rmaddy가 옳다. 더 깨끗한 해결책 – omarzl

+0

@rmaddy 그렇게하면 'Double'이된다. (원하지 않을 수도 있음) – Hamish