Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
KMPを使ってみて感じた良いところ・ツラいところ
Search
Ryu-nakayama
October 05, 2023
Programming
0
2.1k
KMPを使ってみて感じた良いところ・ツラいところ
stmn#2の登壇資料です
Ryu-nakayama
October 05, 2023
Tweet
Share
More Decks by Ryu-nakayama
See All by Ryu-nakayama
SwiftDataと連携したWidgetを作ってみた
ryunakayama
1
53
Swift Macroでメソッドの実行時間を計測できるようにしてみた
ryunakayama
1
110
Appleの審査担当の方とお話ししてみた!
ryunakayama
0
240
大公開!iOS開発の悩みトップ5 〜iOSDC Japan 2024〜
ryunakayama
0
270
Translation API について 〜WWDC24〜
ryunakayama
0
270
効率化に挑戦してみたらモバイル開発が少し快適になった話
ryunakayama
0
1.7k
新卒1年目がプロジェクトを進めるときにコケたポイント
ryunakayama
1
1.8k
期限が近づいてきた!Privacy Manifests対応
ryunakayama
5
11k
新卒iOSエンジニアとしてやってきたこと
ryunakayama
0
1.8k
Other Decks in Programming
See All in Programming
Generating OpenAPI schema from serializers throughout the Rails stack - Kyobashi.rb #5
envek
1
390
[JAWS DAYS 2025] 最近の DB の競合解決の仕組みが分かった気になってみた
maroon1st
0
140
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
1
630
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
7
4.2k
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
950
複数のAWSアカウントから横断で 利用する Lambda Authorizer の作り方
tc3jp
0
120
たのしいSocketのしくみ / Socket Under a Microscope
coe401_
8
1.4k
color-scheme: light dark; を完全に理解する
uhyo
7
500
Django NinjaによるAPI開発の効率化とリプレースの実践
kashewnuts
1
280
AIプログラミング雑キャッチアップ
yuheinakasaka
19
4.9k
Rails 1.0 のコードで学ぶ find_by* と method_missing の仕組み / Learn how find_by_* and method_missing work in Rails 1.0 code
maimux2x
1
250
Honoのおもしろいミドルウェアをみてみよう
yusukebe
1
240
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
380
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
650
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
52k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Typedesign – Prime Four
hannesfritz
41
2.5k
Testing 201, or: Great Expectations
jmmastey
42
7.2k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Why Our Code Smells
bkeepers
PRO
336
57k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Transcript
Chatwork株式会社 モバイルアプリケーション開発部 中山 龍 2023年10月6日 KMPを使ってみて感じた 良いところ・ツラいところ
自己紹介 中山 龍 (なかやま りゅう) • Chatwork株式会社 ◦ iOSエンジニア ◦
2023年4月 新卒として入社 ◦ 社内最年少 (2002年6月生まれの21歳) • 愛知県在住 ◦ フルリモート勤務 ◦ 最近名古屋市内に引っ越しました 2 @ryu_develop
注意
このLTの趣旨 4 このLTは『普段iOSネイティブを触っているエンジニアがKMP を体験してみたよ』という話です KMPに関する深い知見を持っている立場ではないことにご注意ください
各モバイル開発手法の比較
①ネイティブ
①ネイティブ 7 iOS / Androidそれぞれに専用のプログラムを書いて実装する iOS Android
メリット ネイティブの特徴 8 デメリット • 標準のUIやOSの新機能を使える ◦ OSによって提供される最新機能も 使用可能 •
高いパフォーマンスが期待できる • 各OSでの開発が必要 ◦ iOS/Androidに合わせて2つ作成す ることが必要となる ◦ 各OSで開発者に必要な技術が統一 できない
②クロスプラットフォーム ※ ※ ここでは共通のソースコードのみで各 OSのアプリが ビルド可能になるものを指す
②クロスプラットフォーム 1つのプログラムでiOS / Androidそれぞれ動作するようにする 10 iOS / Android など
メリット クロスプラットフォームの特徴 11 デメリット • 1つのソースコードで各OSの開 発ができる ◦ ネイティブでの開発と比べて開発 コストが低く済む
• OSの機能や最新技術が利用できない場 合がある • 複雑な機能には各ネイティブのコード を書く必要がある場合がある • ネイティブに比べてパフォーマンスが 落ちる場合がある
12 ネイティブのように標準のUIやOSの最新機能を使いたいけ ど、クロスプラットフォームのように共通のコードで楽したい...
13 ネイティブのように標準のUIやOSの最新機能を使いたいけ ど、クロスプラットフォームのように共通のコードで楽したい... そこで、部分的に共通化するという選択肢
KMPを導入する
KMPって何?
KMPって何? KMP = Kotlin Multiplatform 16
KMPって何? KMP = Kotlin Multiplatform 17 Kotlinを使って、クロスプラットフォームプロジェクト の開発を簡素化する技術
KMPって何? 少し前だと... KMPを使って、モバイル開発に特化した機能や技術を実現した ものをKMMと呼んでいた ↓ 名称がKMPに統一された 18
KMPって何? 本LTでの『KMP』という表現は 従来の『KMM』のイメージ 19
部分的に共通化する
ネイティブの開発をしていると 21 ネイティブで各OSをそれぞれ開発していると... こう考えることもあるのではないでしょうか? • iOSもAndroidもドメイン知識は共通なのになぁ... • アプリ特有のこの処理、共通なのになぁ...
ネイティブの開発をしていると 22 ネイティブで各OSを開発していると... こう考えることもあるのではないでしょうか? • iOSもAndroidもドメイン知識は共通なのになぁ... • アプリ特有のこの処理、共通なのになぁ... でも •
OS標準のUIや新機能を使って実装したい部分もある...
ネイティブの開発をしていると 23 ネイティブで各OSを開発していると... こう考えることもあるのではないでしょうか? • iOSもAndroidもドメイン知識は共通なのになぁ... • アプリ特有のこの処理、共通なのになぁ... でも •
OS標準のUIや新機能を使って実装したい部分もある... 部分的に共通化するのに使えるのがKMP
KMP(共通部分) 部分的に共通化 共通化する部分はKMPで書き、 必要な部分はそれぞれのネイティブで書く 24 iOS Android
KMPを使うことで... 25 • ネイティブ開発と比べて労力を抑えられる ◦ それぞれのOSに合わせて作る部分を減らすことができる • OSの機能や標準のUIを呼び出すことが可能 ◦ 呼び出したい部分はネイティブで記述する
実際に使ってみた
実装してみる題材
実装してみる題材 • UIにはそれぞれ以下のもので実装する ◦ iOS: SwiftUI ◦ Android: Jetpack Compose
28 TODOアプリを作る • TODOを一覧表示でき、新規に追加ができる ◦ 入力欄に文字を入力し、追加ボタンを押す • TODOの達成・未達成を切り替えることができる ◦ 表示されているTODOの横のアイコンをタップすることで切り替えられる iOS / Androidどちらも実装する
共通化する部分 29 TODOのロジック プレゼンテーションロジック プレゼンテーションロジック UI(SwiftUI) UI(Jetpack Compose)
実装してみた
アプリ起動時 iOS 31 Android
iOS Android テキストフィールドに内容を入力 32
iOS Android 追加ボタンを押すとリストに追加される 33
iOS Android 同様に2件目も追加できる 34
iOS Android アイテム右のアイコンタップで 赤丸→チェック になる 35
サンプルコードのリポジトリ https://github.com/Ryu-nakay/todo-app-with-kmp 36
KMPを使ってみての感想
良いと思ったところ1 共通のロジックを書かなくて済む 38 KMP(Kotlin)を使って書くことで、Swiftで再度書き直す手間が省 けた 今回は、『TODOの表現や振る舞いを定義するコード』を共通化した • 1件のTODOを表す型 • 完了・未完了切り替えの処理
• 複数のTODOの集合を表す型 • TODO追加の処理 など
OS間も含めた『コードの重複』を減らし、高い変更容易性を実現 できる 良いと思ったところ2 39 共通化した部分は仕様の変更が楽 • TODOの表現を変える ◦ ex)『期限』を追加する •
TODOの振る舞いを変える ◦ ex) 『削除』を可能にする といった変更が今後あったとしても... KMP(Kotlin)で共通化したコードを変更するだけで変更を実現可能
ツラいところ1 40 iOS側では型が期待したものではない また、KotlinArrayの要素数すら、型はIntではなくInt32 KMP(Kotlin) Swift Int Int32 Array<T> KotlinArray<T>
一部を挙げると、以下の表のような型になってしまう SwiftからKMPを呼び出した際の型がなかなか不自由... この問題を解消するために何かしら手を打たないとツラい
ツラいところ2 41 Xcodeではサジェストが弱い・コード定義も見られない その型が持っているプロパティ・メソッドがサジェストされるかは割と気まぐれ → サジェストしてもらうというのは期待しない方がよい また、KMPの型やメソッドの実装を見たいと思っても、KotlinやSwiftのコードで見ることは できない😱 (KMPの実装をiOS側で使用する際に、 ObjCヘッダーファイルとして生成されてしまうため
) 実装を見ようとするとツラいものが見える
使ってみてのまとめ 『部分的に共通化する』という考え方はとても良いものだと思った → だが、KMPには良いところだけでなく、ツラいポイントも存在している 42 しっかりと知見を持って • KMPを導入することで得られるメリットが大きいかどうか • KMPを導入するのなら、どのようにツラいポイントと向き合うのか
を考える必要があると感じた。 『何も考えずKMPを導入すればハッピー』
働くをもっと楽しく、創造的に