{"id":13658383,"url":"https://github.com/hhru/kotlin-swift-interopedia","last_synced_at":"2025-06-26T08:03:11.519Z","repository":{"id":45344476,"uuid":"401598018","full_name":"hhru/kotlin-swift-interopedia","owner":"hhru","description":null,"archived":false,"fork":false,"pushed_at":"2021-12-19T17:28:02.000Z","size":66,"stargazers_count":152,"open_issues_count":0,"forks_count":17,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-03-12T23:13:45.701Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hhru.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-31T06:32:30.000Z","updated_at":"2025-03-09T15:33:46.000Z","dependencies_parsed_at":"2022-09-14T16:40:43.465Z","dependency_job_id":null,"html_url":"https://github.com/hhru/kotlin-swift-interopedia","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hhru/kotlin-swift-interopedia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhru%2Fkotlin-swift-interopedia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhru%2Fkotlin-swift-interopedia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhru%2Fkotlin-swift-interopedia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhru%2Fkotlin-swift-interopedia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hhru","download_url":"https://codeload.github.com/hhru/kotlin-swift-interopedia/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hhru%2Fkotlin-swift-interopedia/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262026905,"owners_count":23246951,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T05:00:59.171Z","updated_at":"2025-06-26T08:03:11.501Z","avatar_url":"https://github.com/hhru.png","language":null,"funding_links":[],"categories":["Resources"],"sub_categories":["Android samples"],"readme":"# Kotlin-Swift interopedia\n[![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.kotlin/kotlin-maven-plugin.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.jetbrains.kotlin%22)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nМы создали этот репозиторий, чтобы помочь разработчикам, интересующимся технологией KMM, понять, как будет выглядеть\nописанное ими публичное API общего модуля.\n\nВ сети есть [подробная документация от JetBrains](https://kotlinlang.org/docs/native-objc-interop.html)   \nпро интероп между Kotlin и Swift, однако в ней не рассматриваются подробно все возможности языка Kotlin.\n\nПоэтому мы свели в единую табличку перечень возможностей Kotlin-а и отметили, какими возможностями можно пользоваться\nбез каких-либо проблем, а с какими потребуются те или иные доработки.\n\n## Таблица интеропа\n\nКак пользоваться таблицей:\n\n- Знак :white_check_mark: означает, что указанной фичой Kotlin-а можно спокойно пользоваться, она генерирует\n  Swift-friendly код без необходимости доработок;\n- Знак :warning: означает, что либо для работы фичи требуются какие-то доработки, либо есть несоответствие между\n  ожидаемым и реальным поведением фичи, которое не сильно мешает разработке;\n- Знак :no_entry_sign: означает, что фичой нельзя пользоваться, она генерирует не Swift-friendly код, она работает\n  совсем не так как ожидается, и это может стать помехой в разработке.\n\n\u003cbr/\u003e\n\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\u003cth\u003eФича Kotlin-а\u003c/th\u003e\n\t\t\u003cth\u003eОжидание\u003c/th\u003e\n\t\t\u003cth\u003eСтатус\u003c/th\u003e\n\t\t\u003cth\u003eКомментарий\u003c/th\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eCommon\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/common/Internal%20modifier.md\"\u003eInternal modifier\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eInternal-функции и классы не видны в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eТак и есть, с iOS-разработчиками придётся обсуждать только публичное API общего кода\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/common/JavaDoc%20comments.md\"\u003eJavaDoc comments\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eКомментарии видны в XCode\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eКомментарии видны, если добавить специальный аргумент для компилятора\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eData types\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/types/Primitive%20types.md\"\u003ePrimitive types\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eТипы, объявленные в Kotlin, можно без изменений использовать в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожет требоваться маппинг для целочисленных типов данных / маппинги для Char-а\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/types/Optional%20(nullable)%20primitive%20types.md\"\u003eOptional (nullable) primitive types\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eТип, объявленный как Nullable, является таковым и на стороне Swift / Пользоваться nullable-типами можно без изменений\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eДля примитивных типов требуется маппинг в специальные optional-типы / особенности с Char?\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/types/Mutable,%20immutable%20collections.md\"\u003eMutable, immutable collections\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eСигнатуры List / MutableList / etc имеют значение в Swift-мире и тоже регулируют мутабельность ; Использование коллекций не отличается от Kotlin\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eДля регулировки мутабельности используются ключевые слова let, var / Для мутабельных коллекций требуются дополнительные маппинги\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/types/Collections%20with%20primitive%20types.md\"\u003eCollections with primitive types\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eКоллекции с элементами примитивных типов не требуют дополнительных маппингов\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eМаппинги не требуются только для String-типа\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/types/Collections%20with%20custom%20types%20data.md\"\u003eCollections with custom types data\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eКоллекции с элементами кастомных типов не требуют дополнительных маппингов\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eМаппинги не требуются :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/types/Unit%20and%20Nothing.md\"\u003eUnit and Nothing\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eТипы Unit и Nothing можно использовать так же, как в Kotlin: Unit как объект или void, Nothing - нельзя создать\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eUsual workflow\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Top-level%20functions.md\"\u003eTop-level functions\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункцию можно использовать напрямую после импорта, аналогично Kotlin-у\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eПоявляется класс-обёртка: UtilityKt.topLevelFunction()\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Top-level%20val%20properties%20(readonly).md\"\u003eTop-level val properties (readonly)\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить напрямую после импорта, аналогично Kotlin-у / поле readonly\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eПоявляется класс-обёртка для доступа к свойству: UtilityKt.propertyVal\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Top-level%20var%20properties%20(mutable).md\"\u003eTop-level var properties (mutable)\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить напрямую после импорта, аналогично Kotlin-у / поле mutable\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eПоявляется класс-обёртка для доступа к свойству: UtilityKt.propertyVar\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Extension%20function%20over%20platform%20class.md\"\u003eExtension function over platform class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункцию можно использовать на объекте платформенного класса\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eПоявляется класс-обёртка с методом, принимающим объект нужного класса\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Extension%20properties%20over%20platform%20class.md\"\u003eExtension properties over platform class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить с помощью объекта платформенного класса\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eПоявляется класс-обёртка с методом, принимающим объект нужного класса\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Extension%20properties%20for%20companion%20object%20of%20platform%20class.md\"\u003eExtension properties for companion object of platform class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить с помощью платформенного класса\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eВ .h-файле свойство есть, а в Swift-е не получается использовать\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Extension%20functions%20over%20usual%20class.md\"\u003eExtension functions over usual class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункцию можно использовать на объекте класса\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Extension%20properties%20over%20usual%20class.md\"\u003eExtension properties over usual class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить через объект класса\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Extension%20properties%20for%20companion%20object%20of%20usual%20class.md\"\u003eExtension properties for companion object of usual class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить через класс\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству можно получить через объект companion\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Usual%20class%20constructor.md\"\u003eUsual class constructor\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eРабота с конструктором не отличается от Kotlin-а\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Usual%20class%20val%20property%20(readonly).md\"\u003eUsual class val property (readonly)\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству есть из объекта класса / свойство readonly\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Usual%20class%20var property%20(mutable).md\"\u003eUsual class var property (mutable)\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойству есть из объекта класса / свойство mutable\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Usual%20class%20functions.md\"\u003eUsual class functions\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eРабота с функциями, объявленными внутри класса, не отличается от Kotlin-а\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность соответствует ожиданиям :thumbsup:\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Companion%20object.md\"\u003eCompanion object\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойствам и функциям, объявленным в companion object-е, аналогичен Kotlin-у\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ есть через вспомогательный объект companion\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Objects.md\"\u003eObjects\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ к свойствам и функциям, объявленным в object-е, аналогичен Kotlin-у\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eДоступ есть через вспомогательный объект shared\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Function%20with%20default%20arguments.md\"\u003eFunction with default arguments\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eРабота с функциями, имеющими дефолтные аргументы, аналогична Kotlin-у\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eВсегда приходится указывать все аргументы функции\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/usual-workflow/Constructor%20with%20default%20arguments.md\"\u003eConstructor with default arguments\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eРабота с конструктором, имеющим дефолтные аргументы, аналогична Kotlin-у\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eВсегда приходится указывать все аргументы для конструктора\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eClasses\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Abstract%20class.md\"\u003eAbstract class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожно отнаследоваться от абстрактного класса, IDE подсказывает какие методы надо переопределить\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eВ IDE нет подсказок о необходимости переопределить абстрактный метод\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Annotation%20class.md\"\u003eAnnotation class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eАннотации можно использовать в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eАннотации не попали в .h-файл\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Data%20class.md\"\u003eData class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eData class-ы сохраняют свои свойства после перехода в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНе все возможности data class-ов сохраняются / есть особенности с copy\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Enum%20class.md\"\u003eEnum class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eKotlin-овский enum class превратится в enum Swift-а, и можно будет использовать switch\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНе работает как ожидается. Но сгенерировался объект со статическими элементами\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Inner%20class.md\"\u003eInner class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожно создать инстанс inner-класса / прямого доступа к родительским свойствам и функциям нет\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНебольшие отличия в синтаксисе создания\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Open%20class.md\"\u003eOpen class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожно наследоваться от open-класса / есть доступ к protected-полям / можно переопределять open-методы\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожно переопределять и final-методы\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Sealed%20class.md\"\u003eSealed class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003e Корректно конвертируется в структуру, которую можно передать в switch-конструкцию и сделать exhaustive\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eГенерируется класс с наследниками. Передав в switch нет подсказок об exhaustive\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/classes/Value%20class.md\"\u003eValue class\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eКласс попадёт в .h-файл, им можно будет пользоваться в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eКласс не попал в .h-файл, пользоваться нельзя\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eInterfaces\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/interfaces/Interface.md\"\u003eInterface\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eПри реализации интерфейса, IDE подставит заглушки для всего\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eИнтерфейс стал @protocol-ом. Но почему-то val-свойство превратилось в var\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/interfaces/Sealed%20interface.md\"\u003eSealed interface\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eПри использовании в switch IDE поможет рассмотреть все варианты\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eСгенерировались отдельные протоколы, не связанные между собой\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/interfaces/Fun%20interface.md\"\u003eFun interface\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eС помощью такого протокола можно более простым синтаксисом описать лямбду\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eВ Swift нельзя создать анонимный класс\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eFunctions\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/DSL.md\"\u003eDSL\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eНадеемся, что DSL в Kotlin-е превратится в DSL на Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eСгенерировались функции с receiver-ами, выглядит не так удобно, как хотелось бы\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20returns%20lambda.md\"\u003eFunction returns lambda\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункция, вернувшая лямбду, работает без крашей; лямбду можно вызвать\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность совпадает с ожиданием\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20returns%20primitive%20type.md\"\u003eFunction returns primitive type\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункция, возвращающая примитивный тип, работает без ошибок\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность совпадает с ожиданием\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20with%20extension%20function%20as%20args.md\"\u003eFunction with extension function as args\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожно вызвать функцию так же, как в Kotlin\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eExtension-функция превращается в лямбду с параметром\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20with%20lambda%20arguments.md\"\u003eFunction with lambda arguments\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункция, принимающая в аргументах одну или несколько лямбд, нормально конвертируется в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность совпадает с ожиданием\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20with%20no%20return%20type.md\"\u003eFunction with no return type\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункции, которые ничего не возвращают, можно спокойно вызвать\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность совпадает с ожиданием\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20with%20value%20class%20parameter.md\"\u003eFunction with value class parameter\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункция появится в .h-файле и её можно будет использовать, передавая value-класс\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункция появилась в .h-файле, но аргумент value-класса развернулся в примитивы\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Function%20with%20vararg%20parameter.md\"\u003eFunction with vararg parameter\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003evararg смапился в Swift-овый variardic и используется аналогично\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНе работает так, как ожидается\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Functions%20with%20overloads.md\"\u003eFunctions with overloads\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eИспользование перегруженных функций ничем не отличается от Kotlin-а\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eЕсть особенности при использовании одинаковых имён параметров\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Inline%20functions.md\"\u003eInline functions\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eИнлайн-функции есть в .h-файле, их можно вызвать\u003c/td\u003e\n\t\t\t\u003ctd\u003e:white_check_mark:\u003c/td\u003e\n\t\t\t\u003ctd\u003eРеальность совпадает с ожиданием\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/functions/Suspend%20functions.md\"\u003eSuspend functions\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eSuspend-функции развернулись в удобную для Swift-конструкцию\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eТранслируется в callback, экспериментально - в async / await. Но для использования в реактивных фреймворках требуются дополнительный bridge-код\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd colspan=\"4\" align=\"center\"\u003eGenerics\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Generic%20classes.md\"\u003eGeneric classes\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eСгенерируется класс с generic-ом, пользоваться можно как в Kotlin\u003c/td\u003e\n\t\t\t\u003ctd\u003e:warning:\u003c/td\u003e\n\t\t\t\u003ctd\u003eЕсть некоторые особенности использования типов\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Generic%20functions.md\"\u003eGeneric functions\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eОбычная функция-generic позволяет принять аргумент любого типа\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНет автоматического вывода типа, особенности nullability\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Generic%20interfaces.md\"\u003eGeneric interfaces\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eМожно реализовать протокол с generic-ом после перехода в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eGeneric-и на интерфейсах не поддерживаются\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Bounded%20generics.md\"\u003eBounded generics\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eОграничение типа generic-а, объявленное в Kotlin, сработает и в Swift\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eОграничение не сработало\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Contravariant%20generics.md\"\u003eContravariant generics\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eПри указании ключевого слова in на generic-е, сгенерируется generic со схожим поведением (контравариантный generic)\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНе работает как ожидается, приходится использовать приведение типов\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Covariant%20generics.md\"\u003eCovariant generics\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eПри указании ключевого слова out на generic-е, сгенерируется generic со схожим поведением (ковариантный generic)\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНе работает как ожидается, приходится использовать приведение типов\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Star%20projection.md\"\u003eStar projection\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eСгенерируется generic со схожим поведением (in Nothing / out Any?)\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eНе работает как ожидается, приходится использовать приведение типов\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\t\u003ctr\u003e\n\t\t\t\u003ctd\u003e\u003ca href=\"/docs/generics/Reified%20functions.md\"\u003eReified functions\u003c/a\u003e\u003c/td\u003e\n\t\t\t\u003ctd\u003eФункции с reified нормально вызываются из Swift + работают ожидаемым образом\u003c/td\u003e\n\t\t\t\u003ctd\u003e:no_entry_sign:\u003c/td\u003e\n\t\t\t\u003ctd\u003eВ рантайме функция крашится\u003c/td\u003e\n\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\n## Полезные ссылки\n- Из документации Kotlin\n    - [Документация: Что нового в Kotlin 1.5.30](https://kotlinlang.org/docs/whatsnew1530.html)\n    - [Документация: интероп Swift \u003c--\u003e Kotlin](https://kotlinlang.org/docs/native-objc-interop.html).\n    - [Документация: маппинг типов между C и Kotlin/Native](https://kotlinlang.org/docs/mapping-primitive-data-types-from-c.html)\n    - [Документация: Туториал по использованию Ktor-а в multiplatorm](https://kotlinlang.org/docs/mobile/use-ktor-for-networking.html#set-up-an-http-client)\n    - [Документация: Kotlin-идиомы](https://kotlinlang.org/docs/idioms.html)\n    - [Документация: Concurrency в Kotlin/Native](https://kotlinlang.org/docs/mobile/concurrency-overview.html)\n- [Документация Apple: Про completion handler-ы](https://developer.apple.com/documentation/swift/calling_objective-c_apis_asynchronously)\n- [Документация Swift: про async / await](https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html)\n- [Доклад: Состояние интеропа в 2019 году (Некоторые вещи всё ещё актуальны)](https://www.youtube.com/watch?v=N1Xt-LuAR9A\u0026ab_channel=JetBrainsTV)\n- [Статья: Про Kotlin/Native generics в 2019 году (Всё ещё актуально)](https://medium.com/@kpgalligan/kotlin-native-interop-generics-15eda6f6050f)\n- [Статья: Про построение более удобного кода на Swift при помощи gradle-плагина moko-kswift](https://habr.com/ru/post/571714/)\n- [Статья: Построение DSL в Swift](https://habr.com/ru/company/tinkoff/blog/455760/).\n- Серия статей про написание необходимых обёрток для взаимодействия между корутинами и RxSwift / Combine / OpenCombine\n    - [Статья: Использование suspend в Swift - про неудобство с RxSwift](https://dev.to/touchlab/working-with-kotlin-coroutines-and-rxswift-24fa)\n    - [Статья: Использование suspend в Swift в 2021 году](https://touchlab.co/kotlin-coroutines-swift-revisited/)\n    - [Github: Пример работы корутин с RxSwift / Combine на основе статей от Touchlab](https://github.com/touchlab/SwiftCoroutines)\n- Набор статей про Generic-и в Kotlin:\n    - [Хорошая статья про ковариантность и контравариантность в Kotlin](https://typealias.com/guides/illustrated-guide-covariance-contravariance/)\n    - [Хорошая статья про in и out в Kotlin](https://typealias.com/guides/ins-and-outs-of-generic-variance/)\n    - [Хорошая статья про star projection](https://typealias.com/guides/star-projections-and-how-they-work/)\n- [Github: Список DSL-библиотек на Swift](https://github.com/carson-katri/awesome-result-builders)\n- [Плагин moko-kswift](https://github.com/icerockdev/moko-kswift/)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhhru%2Fkotlin-swift-interopedia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhhru%2Fkotlin-swift-interopedia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhhru%2Fkotlin-swift-interopedia/lists"}