| # Kotlin to Swift mapping | |
| This document gives a quick superficial overview on how Swift export translates Kotlin declarations to Swift. | |
| Currently, Swift export supports only a subset of the Kotlin language; thus this list is intentionally incomplete. | |
| > ❗️ Swift export is in very early stages of development. | |
| > Things change very quickly, and documentation might not catch up at times. | |
| > | |
| > Please note that this part of Swift export will change **very often**. | |
| > Some features are currently implemented the way they are not because this is what we consider _the best_, | |
| > but because it’s easier to start with _some_ (even ugly) quick restricted solutions first, and then gradually improve it towards something | |
| > beautiful. | |
| # Declarations | |
| ## Classifiers | |
| ### Classes | |
| Swift export supports only final classes that directly inherit from `Any` (like `class Foo()`). | |
| They are translated to Swift classes that inherit from a special `KotlinBase` class. | |
| ```kotlin | |
| class MyClass { | |
| val property: Int = 0 | |
| fun method() {} | |
| } | |
| ``` | |
| ```swift | |
| public class MyClass : KotlinRuntime.KotlinBase { | |
| public var property: Swift.Int32 { | |
| get { | |
| ... | |
| } | |
| } | |
| public override init() { | |
| ... | |
| } | |
| public func method() -> Swift.Void { | |
| ... | |
| } | |
| } | |
| ``` | |
| ### Objects | |
| Objects are translated to Swift classes with private `init` and static `shared` accessor. | |
| ```kotlin | |
| object O | |
| ``` | |
| ```swift | |
| public class O : KotlinRuntime.KotlinBase { | |
| public static var shared: O { | |
| get { | |
| ... | |
| } | |
| } | |
| private override init() { | |
| ... | |
| } | |
| } | |
| ``` | |
| ### Typealiases | |
| Typealiases are exported "as is": | |
| ```kotlin | |
| typealias MyInt = Int | |
| ``` | |
| ```swift | |
| public typealias MyInt = Swift.Int32 | |
| ``` | |
| ## Callables | |
| ### Functions | |
| Swift export supports only simple top-level functions and methods: no `suspend`, `inline`, `operator` or extensions. | |
| ```kotlin | |
| fun foo(a: Short, b: Bar) {} | |
| fun baz(): Long = 0 | |
| ``` | |
| ```swift | |
| public func foo(a: Swift.Int16, b: Bar) -> Swift.Void { | |
| ... | |
| } | |
| public func baz() -> Swift.Int64 { | |
| ... | |
| } | |
| ``` | |
| ### Properties | |
| Kotlin properties are translated to Swift properties. | |
| ```kotlin | |
| val a: Int = 0 | |
| var b: Short = 15 | |
| const val c: Int = 0 | |
| ``` | |
| ```swift | |
| public var a: Swift.Int32 { | |
| get { | |
| ... | |
| } | |
| } | |
| public var b: Swift.Int16 { | |
| get { | |
| ... | |
| } | |
| set { | |
| ... | |
| } | |
| } | |
| public var c: Swift.Int32 { | |
| get { | |
| ... | |
| } | |
| } | |
| ``` | |
| ### Constructors | |
| Constructors are translated to Swift initializers. | |
| ```kotlin | |
| class Foo(val prop: Int) | |
| ``` | |
| ```swift | |
| public class Foo : KotlinRuntime.KotlinBase { | |
| public init( | |
| prop: Swift.Int32 | |
| ) { | |
| ... | |
| } | |
| } | |
| ``` | |
| # Types | |
| ## Built-in types | |
| ### Primitive types | |
| | Kotlin | Swift | | |
| |---------|------------------------| | |
| | Boolean | Bool | | |
| | Char | Unicode.UTF16.CodeUnit | | |
| | Byte | Int8 | | |
| | Short | Int16 | | |
| | Int | Int32 | | |
| | Long | Int64 | | |
| | UByte | UInt8 | | |
| | UShort | UInt16 | | |
| | UInt | UInt32 | | |
| | ULong | UInt64 | | |
| | Float | Float | | |
| | Double | Double | | |
| ### kotlin.Any | |
| `Any` is translated to the special `KotlinBase` class. | |
| ### kotlin.Unit | |
| `Unit` is translated to the `Void` type. | |
| ### kotlin.Nothing | |
| `Nothing` is translated to the `Never` type. | |
| ```kotlin | |
| fun foo(): Nothing = TODO() | |
| fun baz(input: Nothing) {} | |
| ``` | |
| ```swift | |
| public func foo() -> Swift.Never { | |
| ... | |
| } | |
| public func baz(input: Swift.Never) -> Void { | |
| ... | |
| } | |
| ``` | |
| ## Classifier types | |
| Swift export supports only a limited number of reference types for now: final classes that directly inherit from `Any`. | |
| # Namespaces | |
| ## Packages | |
| Kotlin packages are translated to nested Swift enums to avoid name collisions. | |
| ```kotlin | |
| // FILE: bar.kt | |
| package foo.bar | |
| fun callMeMaybe() {} | |
| // FILE: baz.kt | |
| package foo.baz | |
| fun callMeMaybe() {} | |
| ``` | |
| ```swift | |
| public extension foo.bar { | |
| public func callMeMaybe() {} | |
| } | |
| public extension foo.baz { | |
| public func callMeMaybe() {} | |
| } | |
| public enum foo { | |
| public enum bar {} | |
| public enum baz {} | |
| } | |
| ``` | |