Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能帮助将URLSession从Swift转换为Kotlin吗_Swift_Urlsession_Kotlin Multiplatform_Kotlin Native - Fatal编程技术网

有人能帮助将URLSession从Swift转换为Kotlin吗

有人能帮助将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

我想用Kotlin制作多平台天气应用程序。我还想在通用模块中分别获取Android和iOS的天气数据

对于安卓系统,我没有任何问题,但对于iOS部分,我有问题。我想使用基础框架来获取和序列化数据与URLSIST。但它不起作用

这是我的天气模型

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