2017-02-22 9 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

私の2番目のエラー:第二の

Return from initializer without initializing all stored properties

}

を最後まで、明らかにI」右を初期化していません。私の最終目標は何かをする適切な方法を見つけることができません。多分私はこれを完全に間違っているのでしょうか?

+3

オブジェクトは、非同期に初期化することはできません。 API呼び出しは、 'Weather'クラスの初期化子を呼び出して、APIから取得した値を渡すべき別のオブジェクトによって呼び出されるべきです。 – dan

+0

@ダン私はその部分を理解しています、私はちょうどこれを行うための正しい方法は、別のオブジェクトと理解していません。 (助けてくれてありがとう) –

+0

メンバー変数をOptionalsとして宣言できます – odlund

答えて

2

私は思います(これは、彼らが非optionalsことを意味します)optionalsとしての性質を宣言、またはデフォルト値でそれらを初期化し、オプションを持っていますあなたが並行性の問題に遭遇していると推測する危険があります。 DarkSkyClientへの非同期呼び出しが返る前に、あなたのオブジェクトのプロパティにアクセスしようとしている可能性があります。ちょっと、それは0だ - つまりは、イベントの順序がある...

  1. 天気のオブジェクトはDarkSkyClientが始まると0
  2. コールにTEMPの設定、初期化され、
  3. 読むの一時変数は、バックグラウンドで実行されます!
  4. DarkSkyClientへの呼び出しが完了したら、tempを実際に必要な値に設定します。あなたは、それは価値がある、非同期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

2番目のオプションでは、 '0'のすべてを' 0.0'に変更し、すべての明示的な型宣言を削除することができます。 – rmaddy

+1

@rmaddyが正しいです、よりきれいな解決策 – omarzl

+0

@rmaddyそれはそれらを 'Double'sにするでしょう(望ましくないかもしれません)。 – Hamish