blob: 549910c2e1dc5943ee641a5fd92645dbb365aae5 [file] [view]
# 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 its 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 {}
}
```