有人能帮助将URLSession从Swift转换为Kotlin吗
我想用Kotlin制作多平台天气应用程序。我还想在通用模块中分别获取Android和iOS的天气数据 对于安卓系统,我没有任何问题,但对于iOS部分,我有问题。我想使用基础框架来获取和序列化数据与URLSIST。但它不起作用 这是我的天气模型有人能帮助将URLSession从Swift转换为Kotlin吗,swift,urlsession,kotlin-multiplatform,kotlin-native,Swift,Urlsession,Kotlin Multiplatform,Kotlin Native,我想用Kotlin制作多平台天气应用程序。我还想在通用模块中分别获取Android和iOS的天气数据 对于安卓系统,我没有任何问题,但对于iOS部分,我有问题。我想使用基础框架来获取和序列化数据与URLSIST。但它不起作用 这是我的天气模型 package com.example.weatherappversion3.shared data class WeatherData ( val cod: String, val message: Lo
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
)
在纯IOS中,您可以在数据上使用<代码>可编辑协议,或者使用基础框架中的<代码> JSONDecoder < /代码>类手动解码。
科特林的等效物是格森。可能还有其他解决办法 编辑:是的,还有其他解决方案,请参见Kotlinx(感谢@joffrey的评论)——数据类天气数据(
@SerializedName(“cod_key”)//可选字段名
瓦尔·科德:字符串,
val消息:长,
val cnt:Long,
val列表:列表,
瓦尔市:瓦尔市
)
didReceiveData(){
val weather=Gson().fromJson(数据,WeatherData::class.java)
}
是目前推荐的多平台序列化方法,它支持js
、native
和jvm
目标
kotlinx序列化的一个示例什么不起作用,如何?它构建了吗,错误是什么?是的,它构建了。实际上我得到了一些数据。但是如何将NSData序列化到我的WeatherData中呢?Kotlin中多平台序列化的常用解决方案是。我不熟悉基础框架或URLSIST,但很可能你可以用它来解决一些问题。你有没有理由为Android和iOS使用不同的网络链接库?为什么不与多平台Kotlin客户端(如Ktor+Kotlinx序列化)共享此API层?我知道,通过这种方式,您可以只编写一次代码,但我想让它单独工作,并了解如何将Swift代码转换为KotlinGson,因为它仅限于JVM,并且使用反射来修改私有字段,这通常并不理想(至少在Kotlin中)。Kotlinx序列化通常更适合Kotlin,因为它更了解Kotlin的功能(密封类、默认值、值类等),并且是多平台的。谢谢@Joffrey,我在回答中添加了您的评论。
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) {
}
}
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)
}