2017-09-03 81 views
1

我写了这个代码(在功能我现在用的是SwiftSky API)使用函数的返回值 - 斯威夫特

// Asked question about WEATHER 

public func weatherQuestion(question: String, userLatitude: Double, userLongitude: Double) -> String { 

var answer = String() 

// Setting up SwiftSky 

SwiftSky.secret ="...." 

SwiftSky.language = .italian 

SwiftSky.locale = .current 

SwiftSky.units.temperature = .celsius 
SwiftSky.units.accumulation = .centimeter 
SwiftSky.units.distance = .kilometer 
SwiftSky.units.precipitation = .millimeter 
SwiftSky.units.pressure = .millibar 
SwiftSky.units.speed = .kilometerPerHour 

if question.contains("meteo") { 

    SwiftSky.get([.current, .alerts, .days, .hours, .minutes], at: Location(latitude: userLatitude, longitude: userLongitude) , on: Date() , { (result) in 

     switch result { 

     case .success(let forecast): 

      answer = (forecast.current?.summary)! 

     case .failure(let error): 

      print(error) 

     } 

    }) 

} 

return answer 
} 

的问题是,当我尝试使用函数的结果通过打印其值(使用下面的代码)

print(weatherQuestion(question: text, userLatitude: Double(self.locationCoordinates.latitude), userLongitude: Double(self.locationCoordinates.longitude))) 

它不打印任何东西。我如何使用函数的结果,以便在打印出来的值不是空的时候?

+2

'SwiftSky'以异步方式工作。您不能从异步任务的某个函数中返回某些内容。你必须添加一个完成处理程序。 – vadian

+0

我该怎么办? @vadian(对不起,但我是编程新手) – edoriggio

+1

请看(例如,有很多很多类似的答案)https://stackoverflow.com/questions/39643334/how-do-you-write-a-completion-处理器在swift 3/39643395#39643395 – vadian

回答

1

SwiftSky.get工作异步并在操作完成时调用带有结果参数的传递闭包。所以,weatherQuestion立即返回。

更改方法签名:

public func weatherQuestion(question: String, userLatitude: Double, userLongitude: Double, completion: (String) -> Void) 

,并称之为:

case .success(let forecast): 
    completion(forecast.current!.summary) 

在完成现在打印:

weatherQuestion(question: text, userLatitude: Double(self.locationCoordinates.latitude), userLongitude: Double(self.locationCoordinates.longitude), completion: { answer in 
     print(answer) 
}) 
+0

它完美无瑕!非常感谢你的帮助 – edoriggio