Общий вызов API с использованием kotlin Reified в Ktor

Я новичок в KMM и пытаюсь создать общую функцию для вызова API, используя ktor с reified, и, похоже, она отлично работает с Android, но выдает ошибку в iOS. Это мой общий возврат вызова API в общем файле.

@Throws(Exception::class)
suspend inline fun<reified T> post(url: String, requestBody: HashMap<String, Any>?) : Either<CustomException, T> {
    try {
        val response = httpClient.post<T> {
            url(BASE_URL.plus(url))
            contentType(ContentType.Any)
            if (requestBody != null) {
                body = requestBody
            }
            headers.remove("Content-Type")
            headers {
                append("Content-Type", "application/json")
                append("Accept", "application/json")
                append("Time-Zone", "+05:30")
                append("App-Version", "1.0.0(0)")
                append("Device-Type", "0")
            }
        }
        return Success(response)
    }  catch(e: Exception) {
        return Failure(e as CustomException)
    }
}

Это хорошо работает в Android, если я назову это так: -

api.post<MyDataClassHere>(url = "url", getBody()).fold(
    {
        handleError(it)
    },
    {
        Log.d("Success", it.toString())
    }
)

Но я не могу запустить его на устройствах iOS, он показывает мне такую ​​​​ошибку: -

some : Error Domain=KotlinException Code=0 "unsupported call of reified inlined function `com.example.myapplication.shared.apicalls.SpaceXApi.post`" UserInfo = {NSLocalizedDescription=unsupported call of reified inlined function `com.example.myapplication.shared.apicalls.SpaceXApi.post`, KotlinException=kotlin.IllegalStateException: unsupported call of reified inlined function `com.example.myapplication.shared.apicalls.SpaceXApi.post`, KotlinExceptionOrigin=}

Любая помощь в этом приветствуется. Спасибо

0
0
1 269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, из разговора в Slack здесь становится ясно, что невозможно создать универсальную функцию такого типа, поскольку swift не поддерживает reified. Единственное решение состоит в том, что нам нужно создавать разные функции для каждого отдельного вызова API, который нам нужен.

Например: - мы можем создать интерфейс, внутри которого у нас есть вся реализация API, и использовать его на собственных платформах. Так :-

interface ApiClient {
    suspend fun logIn(…): …
    suspend fun createBlogPost(…): …
    // etc
}

Теперь мы можем использовать это на наших собственных платформах.

Другие вопросы по теме