Kotlin Multiplatform makes you write a hand-maintained bridge layer on iOS — one file per domain that wraps, streams, and re-maps every Kotlin type into Swift. This is the anti-corruption layer, what it costs, and why a Rust + UniFFI core deletes it as a standing module.
Put the whole domain — session, repositories, use cases, networking — in Rust, and let SwiftUI and Compose sit on top. The bridge is auto-generated and gitignored. This walks through the idea, the generated bindings, what you lose in Swift and Kotlin at the call site, and whether it scales to hundreds of feature modules.