如何解决有人可以帮助将 URLSession 从 Swift 转换为 Kotlin
我想用 Kotlin 制作多平台天气应用程序。而且我还想在通用模块中为 Android 和 iOS 分别获取天气数据。
使用 Android 我没有任何问题,但使用 iOS 部分我有。我想使用 Foundation 框架通过 URLSession 获取和序列化数据。但它不起作用。
这是我的天气模型。
package com.example.weatherappversion3.shared
data class WeatherData (
val cod: String,val message: Long,val cnt: Long,val list: List<ListElement>,val city: City
)
data class City (
val id: Long,val name: String,val coord: Coord,val country: String,val population: Long,val timezone: Long,val sunrise: Long,val sunset: Long
)
data class Coord (
val lat: Double,val lon: Double
)
data class ListElement (
val dt: Long,val main: MainClass,val weather: List<Weather>,val clouds: Clouds,val wind: Wind,val visibility: Long,val pop: Double,val sys: Sys,val dtTxt: String,val snow: Rain? = null,val rain: Rain? = null
)
data class Clouds (
val all: Long
)
data class MainClass (
val temp: Double,val feelsLike: Double,val temp_min: Double,val temp_max: Double,val pressure: Long,val seaLevel: Long,val grndLevel: Long,val humidity: Long,val tempKf: Double
)
data class Rain (
val the3H: Double
)
data class Sys (
val pod: Pod
)
enum class Pod {
D,N
}
data class Weather (
val id: Long,val main: MainEnum,val description: String,val icon: String
)
enum class MainEnum {
Clear,Clouds,Rain,Snow
}
data class Wind (
val speed: Double,val deg: Long,val gust: Double
)
这是我的要求:
package com.example.weatherappversion3.shared
import com.example.weatherappversion3.shared.constants.Constants
//import cocoapods.Alamofire.*
import platform.Foundation.*
import platform.darwin.NSObject
//import SwiftyJSON
actual class WeatherManager {
actual var weatherData: WeatherData? = null
var data = NSData()
//https://api.openweathermap.org/data/2.5/forecast?appid=e83bce43f40758140ef6927fda5cfc85&units=metric&lat=48.51320000&lon=32.25970000
var url = "https://api.openweathermap.org/data/2.5/forecast?appid=${Constants().AppId}&units=${Constants().units}&lat=${Constants().lat}&lon=${Constants().lon}"
actual fun getWeatherForecastFor(updateUI: ()->Unit) {
println("Start request for iOS")
asyncRequest(url)
updateUI()
}
fun asyncRequest(url: String) {
val delegate = object : NSObject(),NSURLSessionDataDelegateProtocol {
override fun URLSession(session: NSURLSession,dataTask: NSURLSessionDataTask,didReceiveData: NSData) {
data = didReceiveData
}
override fun URLSession(session: NSURLSession,task: NSURLSessionTask,didCompleteWithError: NSError?) {
val response = task.response
if (response == null || (response as NSHTTPURLResponse).statusCode.toInt() != 200) {
return
}
if (didCompleteWithError != null) {
return
}
}
}
val session = NSURLSession.sessionWithConfiguration(
NSURLSessionConfiguration.defaultSessionConfiguration(),delegate,delegateQueue = NSOperationQueue.mainQueue()
)
session.dataTaskWithURL(NSURL(string = url)).resume()
}
actual fun getWeatherForecastForSpecialCity(city: String) {
}
}
解决方法
Kotlinx serialization 是目前推荐的多平台序列化方式,它支持 js
、native
和 jvm
目标
Here you can see kotlinx 序列化示例
,在纯 iOS 中,您可以对数据使用 Codable
协议,或者使用 Foundation 框架中的 JSONDecoder
类手动解码。
Kotlin 的等价物是 Gson。可能还有其他解决方案。
编辑:是的,还有其他解决方案,请参阅 Kotlinx(感谢 @joffrey 的评论)- https://github.com/Kotlin/kotlinx.coroutines
data class WeatherData (
@SerializedName("cod_key") // Optional field name
val cod: String,val message: Long,val cnt: Long,val list: List<ListElement>,val city: City
)
didReceiveData() {
val weather = Gson().fromJson<WeatherData>(data,WeatherData::class.java)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。