Slide 1

Slide 1 text

Swift愛好会 の 思い出 2024 年 5 月 18 日 【第一部完!パーティー】集まれSwift好き! Swift愛好会 vol.82

Slide 2

Slide 2 text

Who am I ● Name ● 佐藤剛士(さとうたけし) ● Company ● Merpay, Inc.(2019/01 ~) ● Role ● Software Engineer (iOS) ● Account ● Twitter: @hatakenokakashi ● Facebook: 佐藤剛士 ● GitHub: SatoTakeshiX

Slide 3

Slide 3 text

Swift/Kotlin愛好会 第一部完! おつかれさまでした 🎉

Slide 4

Slide 4 text

私もたくさん 発表しました

Slide 5

Slide 5 text

● SwiftUIのデータ管理 ○ 集まれSwift好き!Swift愛好会 vol.56 @ オンライン発表資料 ○ 2020 年 12 月 9 日 ● Xcodegenを個人アプリに導入 ○ 集まれSwift好き!Swift愛好会 vol.58 @ オンライン ○ 2021 年 3 月 17 日 ● Swift Concurrency 入門 ○ 集まれSwift好き!Swift愛好会 vol.65 @ オンライン ○ 2022 年 2 月 22 日 ● What’s new in Vision ○ 集まれSwift好き!Swift愛好会スピンオフWWDC22セッション要約会 @オンライン ○ 2022 年 6 月 24 日 ● Swift 5.9からのデータ監視 Observationフレームワーク入門 ○ 【帰ってきた開発合宿!】集まれKotlin好き!Kotlin愛好会 vol.48 ○ 2023/11/26

Slide 6

Slide 6 text

Swift愛好会の特徴は?

Slide 7

Slide 7 text

合宿がある!🏕

Slide 8

Slide 8 text

2016年12月 土善旅館

Slide 9

Slide 9 text

2022年11月 沖縄合宿

Slide 10

Slide 10 text

2023年11月 土善旅館

Slide 11

Slide 11 text

合宿での成果

Slide 12

Slide 12 text

2022/11合宿 個人アプリの 「風水アプリ」プロジェクトに Xcode Cloudと国際化対応を導入

Slide 13

Slide 13 text

その後のアプリ 英語化対応し2023年6月リリースしたとこ ろ、2023年度の売上の約24%が海外から となった。 また前年比30%ダウンロード数が上がった 国際化で 30%ダウンロード数 アップ!

Slide 14

Slide 14 text

2023/11合宿 技術書典15の新刊 Swift 5.9からのデータ監視 Observation フレームワーク入門 入稿前の最終チェックをしてました

Slide 15

Slide 15 text

商業版も発刊 発行日:2024/04/19 発行社:インプレス NextPublishing Amazonなどで購入できます https://nextpublishing.jp/book/17670.htm l

Slide 16

Slide 16 text

良い機会を提供していただいた Swift愛好会には 感謝です 🙌

Slide 17

Slide 17 text

【宣伝】 Swift 5.9からのデータ監視 Observationフレームワーク入門

Slide 18

Slide 18 text

Observationフレームワーク ● Swiftの公式オブザーバーパターンフレームワーク ● iOS 17.0、iPadOS 17.0、macOS 14.0以上から利用可能 ● オープンソース ● Swiftマクロを利用 ● ObservableObjectよりもハイパフォーマンス

Slide 19

Slide 19 text

ObservableObjectで作ると struct ParentObjectView: View { @StateObject private var itemModel: ItemModel = .init() var body: some View { let _ = Self._printChanges() List(itemModel.items.indices, id: \.self) { index in ChildObjectView( isChecked: $itemModel.items[index].isChecked, name: itemModel.items[index].name ) } } } private struct ChildObjectView: View { @Binding var isChecked: Bool var name: String var body: some View { let _ = Self._printChanges() Toggle(isOn: $isChecked, label: { Text(name) }) } }

Slide 20

Slide 20 text

ObservableObjectで作ると デバックエリアの出力 ParentObjectView: _itemModel changed. ChildObjectView: @self, _isChecked changed. ChildObjectView: @self, _isChecked changed. ChildObjectView: @self, _isChecked changed.

Slide 21

Slide 21 text

Observationフレームワークで作ると struct ParentObservableView: View { @State private var itemModel: ItemModel = .init() var body: some View { let _ = Self._printChanges() List(itemModel.items) { item in @Bindable var item = item ChildObservableView( isChecked: $item.isChecked, name: item.name ) } } } private struct ChildObservableView: View { @Binding var isChecked: Bool var name: String var body: some View { let _ = Self._printChanges() Toggle(isOn: $isChecked, label: { Text(name) }) } }

Slide 22

Slide 22 text

Observationフレームワークで作ると デバックエリアの出力 ChildObservableView: @self, _isChecked changed.

Slide 23

Slide 23 text

Observationフレームワークの使い方 @Observable fileprivate final class Book { var isBorrowed: Bool = false func switchBorrow() { isBorrowed.toggle() } } struct ObservationView: View { @State private var book = Book() var body: some View { VStack { Text(book.isBorrowed ? "貸出中" : "貸出可能") Button { book.switchBorrow() } label: { Text(book.isBorrowed ? "この本を返す" : "この本 を借りる") } } } }

Slide 24

Slide 24 text

利用可能なプロパティラッパー @State @Environment @Binding @Bindable // new

Slide 25

Slide 25 text

使い分け

Slide 26

Slide 26 text

Observation入門す るなら これ一冊でOK!