Что такое source set?Набор исходников и зависимостей, участвующий в компиляциях определённых таргетов. commonMain используется всеми таргетами данного модуля; платформенный набор видит подключённый общий код, но не наоборот. Это не обещание поддержки всех существующих Kotlin-платформ. Project structure.
Зачем нужны expect и actual?Expect задаёт общий контракт, actual предоставляет реализацию для каждого соответствующего таргета. Actual может жить в промежуточном наборе. Для крупных или подменяемых зависимостей подходит интерфейс с DI; API, уже имеющему общую реализацию, такая обёртка может не требоваться. Expect/actual.
Как устроена иерархия source sets?Шаблон создаёт общие и промежуточные наборы в зависимости от настроенных таргетов. Например, iosMain разделяется между устройством и симулятором; наличие appleMain/nativeMain и доступные API определяет весь граф таргетов. Не считайте одно имя набора гарантией одинаковых API в любом проекте. Hierarchy.
Как общий код попадает в iOS-приложение?Kotlin/Native может собрать framework; доступны прямая интеграция с Xcode и способы доставки через CocoaPods/SPM в зависимости от проекта. XCFramework — контейнер вариантов бинарника, а не отдельный язык общего кода. iOS integration methods.
Как suspend-функции и Flow выглядят из Swift?В Objective-C interop suspend экспортируется с completion handler; Swift 5.5+ поддерживает async-вызов с ограничениями моста. Flow автоматически не становится универсальным Swift AsyncSequence. Нужны адаптер и договор отмены/владения; отдельный Swift export и плагины проверяют по их собственной документации. Interop.
Что стоит выносить в общий код, а что оставить на платформе?Общие модели, правила и доступные на всех таргетах data API — кандидаты для commonMain. Конкретная системная интеграция может остаться за интерфейсом. Это проектное решение: выбранная библиотека, тестируемость и различия платформ важнее максимального процента общего кода. Структура, expect/actual и интерфейсы.