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.3k
KMPを使ってみて感じた良いところ・ツラいところ
stmn#2の登壇資料です
Ryu-nakayama
October 05, 2023
Tweet
Share
More Decks by Ryu-nakayama
See All by Ryu-nakayama
「ジェン文字」使ってますか?
ryunakayama
0
31
Health Kit × Foundation Models でAIコーチを作ってみた
ryunakayama
0
320
iOSの画面の状態のアレコレを調査してみた
ryunakayama
0
56
作文ツール(Writing Tools)をアプリから制御する
ryunakayama
0
38
iOSアプリで測る!名古屋駅までの 方向と距離
ryunakayama
0
270
「ジェン文字」をアプリ内で使ってみよう
ryunakayama
0
140
SwiftDataと連携したWidgetを作ってみた
ryunakayama
1
160
Swift Macroでメソッドの実行時間を計測できるようにしてみた
ryunakayama
1
210
Appleの審査担当の方とお話ししてみた!
ryunakayama
0
320
Other Decks in Programming
See All in Programming
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
38k
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
290
PostgreSQLで手軽にDuckDBを使う!DuckDB&pg_duckdb入門/osc25hi-duckdb
takahashiikki
0
230
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
0
130
まだ間に合う!Claude Code元年をふりかえる
nogu66
5
930
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
640
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
150
Go コードベースの構成と AI コンテキスト定義
andpad
0
150
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.5k
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
160
ゲームの物理 剛体編
fadis
0
400
JETLS.jl ─ A New Language Server for Julia
abap34
2
470
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
610
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
How to Ace a Technical Interview
jacobian
281
24k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
61
48k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
140
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
48
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
880
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を導入すればハッピー』
働くをもっと楽しく、創造的に