add kotlin-playground styles to OBJC_INTEROP.md (#2064)

This commit is contained in:
Alexander Prendota
2018-09-14 17:03:25 +03:00
committed by Nikolay Igotti
parent 1794f08638
commit 5b63cdb4b2
+53 -9
View File
@@ -68,35 +68,54 @@ Kotlin constructors are imported as initializers to Swift/Objective-C.
Top-level Kotlin functions and properties are accessible as members of a special class. Top-level Kotlin functions and properties are accessible as members of a special class.
Each Kotlin package is translated into such a class. E.g. Each Kotlin package is translated into such a class. E.g.
```
<div class="sample" markdown="1" theme="idea" data-highlight-only>
```kotlin
package my.library package my.library
fun foo() {} fun foo() {}
``` ```
</div>
can be called from Swift like can be called from Swift like
```
<div class="sample" markdown="1" theme="idea" mode="swift">
```swift
Framework.foo() Framework.foo()
``` ```
</div>
### Method names translation ### Method names translation
Generally Swift argument labels and Objective-C selector pieces are mapped to Kotlin Generally Swift argument labels and Objective-C selector pieces are mapped to Kotlin
parameter names. Anyway these two concepts have different semantics, so sometimes parameter names. Anyway these two concepts have different semantics, so sometimes
Swift/Objective-C methods can be imported with clashing Kotlin signature. In this case Swift/Objective-C methods can be imported with clashing Kotlin signature. In this case
clashing methods can be called from Kotlin using named arguments, e.g.: clashing methods can be called from Kotlin using named arguments, e.g.:
```
<div class="sample" markdown="1" theme="idea" mode="swift">
```swift
[player moveTo:LEFT byMeters:17] [player moveTo:LEFT byMeters:17]
[player moveTo:UP byInches:42] [player moveTo:UP byInches:42]
``` ```
</div>
in Kotlin would be: in Kotlin would be:
``` <div class="sample" markdown="1" theme="idea" data-highlight-only>
```kotlin
player.moveTo(LEFT, byMeters = 17) player.moveTo(LEFT, byMeters = 17)
player.moveTo(UP, byInches = 42) player.moveTo(UP, byInches = 42)
``` ```
</div>
### Errors and exceptions ### Errors and exceptions
Kotlin has no concept of checked exceptions, all Kotlin exceptions are unchecked. Kotlin has no concept of checked exceptions, all Kotlin exceptions are unchecked.
@@ -160,35 +179,54 @@ as corresponding `Unit` singleton in Swift/Objective-C. The value of this single
can be retrieved in the same way as for any other Kotlin `object` can be retrieved in the same way as for any other Kotlin `object`
(see singletons in the table above). (see singletons in the table above).
To sum the things up: To sum the things up:
```
<div class="sample" markdown="1" theme="idea" data-highlight-only>
```kotlin
fun foo(block: (Int) -> Unit) { ... } fun foo(block: (Int) -> Unit) { ... }
``` ```
</div>
would be represented in Swift as would be represented in Swift as
``` <div class="sample" markdown="1" theme="idea" mode="swift">
```swift
func foo(block: (NSNumber) -> KotlinUnit) func foo(block: (NSNumber) -> KotlinUnit)
``` ```
</div>
and can be called like and can be called like
```
<div class="sample" markdown="1" theme="idea" data-highlight-only>
```kotlin
foo { foo {
bar($0 as! Int32) bar($0 as! Int32)
return KotlinUnit() return KotlinUnit()
} }
``` ```
</div>
## Casting between mapped types ## Casting between mapped types
When writing Kotlin code, an object may require to be converted from Kotlin type When writing Kotlin code, an object may require to be converted from Kotlin type
to equivalent Swift/Objective-C type (or vice versa). In this case plain old to equivalent Swift/Objective-C type (or vice versa). In this case plain old
Kotlin cast can be used, e.g. Kotlin cast can be used, e.g.
```
<div class="sample" markdown="1" theme="idea" data-highlight-only>
```kotlin
val nsArray = listOf(1, 2, 3) as NSArray val nsArray = listOf(1, 2, 3) as NSArray
val string = nsString as String val string = nsString as String
val nsNumber = 42 as NSNumber val nsNumber = 42 as NSNumber
``` ```
</div>
## Subclassing ## Subclassing
### Subclassing Kotlin classes and interfaces from Swift/Objective-C ### Subclassing Kotlin classes and interfaces from Swift/Objective-C
@@ -211,13 +249,19 @@ overriding method must have the same parameter names as the overridden one.
Sometimes it is required to override initializers, e.g. when subclassing `UIViewController`. Sometimes it is required to override initializers, e.g. when subclassing `UIViewController`.
Initializers imported as Kotlin constructors can be overridden by Kotlin constructors Initializers imported as Kotlin constructors can be overridden by Kotlin constructors
marked with `@OverrideInit` annotation: marked with `@OverrideInit` annotation:
```
<div class="sample" markdown="1" theme="idea" mode="swift">
```swift
class ViewController : UIViewController { class ViewController : UIViewController {
@OverrideInit constructor(coder: NSCoder) : super(coder) @OverrideInit constructor(coder: NSCoder) : super(coder)
... ...
} }
``` ```
</div>
The overriding constructor must have the same parameter names and types as the overridden one. The overriding constructor must have the same parameter names and types as the overridden one.
To override different methods with clashing Kotlin signatures, one can add To override different methods with clashing Kotlin signatures, one can add