2017-02-22 36 views
3

好了,所以剛開始,我的繼承人代碼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

在倒數第二}

現在,很明顯我m沒有正確初始化。我找不到合適的方法去做我的最終目標。也許我完全錯了嗎?

+3

對象不能異步初始化自己。您的API調用應由另一個應調用Weather類的初始化程序的對象調用,並傳入從API獲取的值。 – dan

+0

@dan我明白那一部分,我只是不明白用另一個對象做什麼的正確方法。 (另外,感謝您的幫助) –

+0

你可以聲明你的成員變量爲可選項 – odlund

回答

2

我會有可能會猜測您正遇到併發問題。您可能在對異步調用DarkSkyClient返回之前嘗試訪問您的對象的屬性(如果出現錯誤,我會提前道歉)。即,事件的順序是...

  1. 天氣對象初始化,設置溫度爲0
  2. 電話DarkSkyClient開始,在後臺運行
  3. 讀取臨時變量 - 嘿,這是0!
  4. 調用DarkSkyClient完成後,將溫度設置爲您真正想要的值。壞

那麼你真正需要做的是開關控制模式的反轉:

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

如果你不熟悉使用異步API進行開發是值得的,同時在讀了學科;它可能非常棘手(遺憾的是,我沒有任何關於好的底漆的建議)。 希望這有助於!

+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這將使他們'雙'(這可能會或可能不會被期望) – Hamish