Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS向けのKMP実装:SKIEの使い方

WasabiMuffin
December 14, 2023
220

 iOS向けのKMP実装:SKIEの使い方

WasabiMuffin

December 14, 2023
Tweet

Transcript

  1. val greeting: String = "Hello" var platform: String = "Android"

    let greeting: String = "Hello" var platform: String = "iOS" Variables
  2. fun greet(name: String = "World"): String { return "Hello, $name"

    } greet() // or greet("Android") // or greet(name = "Android") func greet(name: String = "World") -> String { return ("Hello, \(name)") } greet() // or greet(name: "iOS") Functions
  3. interface Platform { val version: String fun greet() } class

    Android(override val version: String = "14"): Platform { override fun greet() { println("Hello, Android $version”) } } val platform = Android() protocol Platform { var version: String { get } func greet() } class Ios : Platform { let version: String init(version: String = "17") { self.version = version } func greet() { print("Hello, iOS \(version)") } } let platform = Ios() Classes
  4. enum class Platform { ANDOID, IOS } when (platform) {

    Platform.ANDROID -> println("Android") Platform.IOS -> println("iOS") } enum Platform { case android case ios } switch platform { case .android: print("Android") case .ios: print("iOS") } Enums
  5. sealed class Platform { data class Android(val name: String): Platform()

    data class Ios(val version: Int): Platform() } when (platform) { is Platform.Android -> println(result.name) is Platform.Ios -> println(result.version) } enum Platform { case android(name: String) case ios(version: Int) } switch platform { case .android(name: let name): print(name) case .ios(version: let version): print(version) } Sealed Classes
  6. suspend fun fetchData() { delay(5000) print("Complete") } runBlocking { fetchData()

    } func fetchData() async { try await Task.sleep(nanoseconds: 5000000000) print("Complete") } Task { await fetchData() } Concurrency
  7. val flow = flowOf(1, 2, 3) runBlocking { flow.collect {

    println(it) } } let sequence = [1, 2, 3].publisher.values Task { for await i in sequence { print(i) } } Concurrency
  8. fun greet(name: String = "World"): String { return "Hello, $name"

    } greet() // or greet(name: "iOS") Default Values ཧ૝
  9. fun greet(name: String = "World"): String { return "Hello, $name"

    } greet() greet(name: “iOS") Default Values ཧ૝ ࣮ࡍ
  10. interface Platform { val version: String fun greet() } class

    Android(override val version: String = "14"): Platform { override fun greet() { println("Hello, Android $version") } } let platform = Android() Default Values ཧ૝
  11. interface Platform { val version: String fun greet() } class

    Android(override val version: String = "14"): Platform { override fun greet() { println("Hello, Android $version") } } let platform = Android() let platform = Android(version: "14") Default Values ཧ૝ ࣮ࡍ
  12. enum class Platform { Android, Ios } switch platform {

    case .android: print("Android") case .ios: print(“iOS") } Enums ཧ૝
  13. enum class Platform { Android, Ios } switch platform {

    case .android: print("Android") case .ios: print(“iOS") } switch platform { case .android: print("Android") case .ios: print(“iOS") default: fatalError() } Enums ཧ૝ ࣮ࡍ
  14. sealed class Platform { data class Android(val name: String): Platform()

    data class Ios(val version: Int): Platform() } switch platform { case .android(name: let name): print(name) case .ios(version: let version): print(version) } Sealed Classes ཧ૝
  15. sealed class Platform { data class Android(val name: String): Platform()

    data class Ios(val version: Int): Platform() } switch platform { case .android(name: let name): print(name) case .ios(version: let version): print(version) } switch platform { case let platform as Platform.Android: print(platform.name) case let platform as Platform.Ios: print(platform.version) default: fatalError() } Sealed Classes ཧ૝
  16. suspend fun fetchData() { delay(5000) print("Complete") } Task { await

    fetchData() } Task { try await fetchData() } Suspend ཧ૝ ࣮ࡍ
  17. suspend fun fetchData() { delay(5000) print("Complete") } Task { await

    fetchData() } let task = Task { try await fetchData() } task.cancel() // Ωϟϯηϧ͞Εͳ͍ Suspend ཧ૝ ࣮ࡍ
  18. val flow = flowOf(1, 2, 3) Task { for await

    i in flow { print(i) } } Flow ཧ૝
  19. val flow = flowOf(1, 2, 3) Task { for await

    i in flow { print(i) } } Wrapper? Flow collector? Flow ཧ૝ ࣮ࡍ
  20. SKIE Setup plugins { id("co.touchlab.skie") version "0.5.6" } ... sourceSets

    { val commonMain by getting { dependencies { implementation( "co.touchlab.skie:configuration-annotations:0.5.6" ) } } } shared/build.gradle.kts
  21. fun greet(name: String = "World"): String { return "Hello, $name"

    } greet() // or greet(name: “iOS") Default Values ཧ૝ ࣮ࡍ
  22. @DefaultArgumentInterop.Enabled fun greet(name: String = "World"): String { return "Hello,

    $name" } greet() // or greet(name: “iOS") Default Values ཧ૝ ࣮ࡍ
  23. @DefaultArgumentInterop.Enabled fun greet(name: String = "World"): String { return "Hello,

    $name" } greet() // or greet(name: “iOS") Default Values ཧ૝
  24. interface Platform { val version: String fun greet() } class

    Android(override val version: String = "14"): Platform { override fun greet() { println("Hello, Android $version") } } let platform = Android() let platform = Android(version: "14") Default Values ཧ૝ ࣮ࡍ
  25. interface Platform { val version: String fun greet() } class

    Android @DefaultArgumentInterop.Enabled constructor( override val version: String = "14" ) : Platform { override fun greet() { println("Hello, Android $version") } } let platform = Android() let platform = Android(version: "14") Default Values ཧ૝ ࣮ࡍ
  26. interface Platform { val version: String fun greet() } class

    Android @DefaultArgumentInterop.Enabled constructor( override val version: String = "14" ) : Platform { override fun greet() { println("Hello, Android $version") } } let platform = Android() let platform = Android(version: "14") Default Values ཧ૝
  27. enum class Platform { Android, Ios } switch platform {

    case .android: print("Android") case .ios: print(“iOS") } switch platform { case .android: print("Android") case .ios: print(“iOS") default: fatalError() } Enums ཧ૝ ࣮ࡍ
  28. enum class Platform { Android, Ios } switch platform {

    case .android: print("Android") case .ios: print(“iOS") } Enums ཧ૝
  29. sealed class Platform { data class Android(val name: String): Platform()

    data class Ios(val version: Int): Platform() } switch platform { case .android(name: let name): print(name) case .ios(version: let version): print(version) } switch platform { case let platform as Platform.Android: print(platform.name) case let platform as Platform.Ios: print(platform.version) default: fatalError() } Sealed Classes ཧ૝ ࣮ࡍ
  30. sealed class Platform { data class Android(val name: String): Platform()

    data class Ios(val version: Int): Platform() } switch onEnum(of: platform) { case .android(name: let name): print(name) case .ios(version: let version): print(version) } switch platform { case let platform as Platform.Android: print(platform.name) case let platform as Platform.Ios: print(platform.version) default: fatalError() } Sealed Classes ཧ૝ ࣮ࡍ
  31. sealed class Platform { data class Android(val name: String): Platform()

    data class Ios(val version: Int): Platform() } switch onEnum(of: platform) { case .android(name: let name): print(name) case .ios(version: let version): print(version) } Sealed Classes ཧ૝
  32. suspend fun fetchData() { delay(5000) print("Complete") } Task { await

    fetchData() } let task = Task { try await fetchData() } task.cancel() // Ωϟϯηϧ͞Εͳ͍ Suspend ཧ૝ ࣮ࡍ
  33. suspend fun fetchData() { delay(5000) print("Complete") } Task { await

    fetchData() } let task = Task { try await fetchData() } task.cancel() // Ωϟϯηϧ͞ΕΔΑ͏ʹͳΔ Suspend ཧ૝ ࣮ࡍ
  34. val flow = flowOf(1, 2, 3) Task { for await

    i in flow { print(i) } } Wrapper? Flow collector? Flow ཧ૝ ࣮ࡍ
  35. val flow = flowOf(1, 2, 3) Task { for await

    i in flow { print(i) } } Flow ཧ૝
  36. SKIE Interop ☺ Default Values, Enums, Sealed Classes, Suspend, Flow

    SKIE Generics, Exceptions, Names, Interfaces… ☹
  37. Kotlin Docs: Native Objc Interop https://kotlinlang.org/docs/native-objc-interop.html Writing Swift Friendly KMP

    Apis https://medium.com/@aoriani/list/writing-swiftfriendly-kotlin-multiplatform-apis-c51c2b317fce Kotlin-Swift Interopedia https://github.com/kotlin-hands-on/kotlin-swift-interopedia KMP for iOS developers: state & future by Salomon Brys https://kotlinconf.com/2023/talks/387260/ Kotlin Multiplatform Mobile for Teams by Kevin Gilligan https://kotlinconf.com/2023/talks/391895/ Kotlin to Swift Transformations | SKIE Live Demo & QA https://www.youtube.com/watch?v=GK8lJq2Z76Y iOS Development With Kotlin Multiplatform: Tips and Tricks https://www.youtube.com/watch?v=eFzy1BRtHps Extra Resources