Slide 1

Slide 1 text

Road to Swift 6 篠原 裕貴 2024/7/11

Slide 2

Slide 2 text

Introduction Name: 篠原 裕貴
 Work: 株式会社マネーフォワード > マネーフォワードビジ ネスカンパニー > ERP開発本部 > 福岡第一開発部 > Warriorグループ > モバイルアプリ開発チーム 
 Career: 公務員 > ワーホリ > 英会話講師 > iOSエンジニア 
 Hobbies: ランニング、柴犬、アニメ 
 


Slide 3

Slide 3 text

マネーフォワード クラウド経費 
 


Slide 4

Slide 4 text

もうすぐSwift 6がやってくる ❏ 7/10時点でのSwift最新バージョン 5.10.1 ❏ Xcode16 betaをインストールするとSwift 6を使うことができる ❏ データ競合がなくなってアプリのパフォーマンスが上がる

Slide 5

Slide 5 text

もうすぐSwift 6がやってくる ❏ 7/10時点でのSwift最新バージョン 5.10.1 ❏ Xcode16 betaをインストールするとSwift 6を使うことができる ❏ データ競合がなくなってアプリのパフォーマンスが上がる 今のコードベースだ とBuildしない可能 性が💥

Slide 6

Slide 6 text

もうすぐSwift 6がやってくる ❏ 7/10時点でのSwift最新バージョン 5.10.1 ❏ Xcode16 betaをインストールするとSwift 6を使うことができる ❏ データ競合がなくなってアプリのパフォーマンスが上がる

Slide 7

Slide 7 text

もうすぐSwift 6がやってくる ❏ 7/10時点でのSwift最新バージョン 5.10.1 ❏ Xcode16 betaをインストールするとSwift 6を使うことができる ❏ データ競合がなくなってアプリのパフォーマンスが上がる データ競合を起こす可能性の あるコードは全てビルドエラー になってしまう

Slide 8

Slide 8 text

Road to Swift 6: アジェンダ ❏ Concurrency ❏ Actor ❏ Steps to enable Swift 6 mode ❏ Tips

Slide 9

Slide 9 text

Concurrency

Slide 10

Slide 10 text

Before Concurrency ❏ 例) APIのリクエストのレスポンスをクロージャで受け取る

Slide 11

Slide 11 text

Before Concurrency ❏ 例) APIのリクエストのレスポンスをクロージャで受け取る ❏ レスポンスを使ってさらにリクエストを投げる場合処理がネストしてしまう

Slide 12

Slide 12 text

With Concurrency ❏ 例) APIのリクエストをawaitで実行する。Task(非同期なコンテキストを提供)で囲む。 ❏ 上から下に読める

Slide 13

Slide 13 text

With Concurrency ❏ 例) APIのリクエストをawaitで実行する ❏ 上から下に読める ❏ idsを取得→imagesを取得→showImagesを実行 awaitの処理が終わるまで 処理が次に進まない (ブ ロックするわけではない )

Slide 14

Slide 14 text

Actor

Slide 15

Slide 15 text

Actor ❏ class、struct、enumというデータ型があったところにactorが加わった classと似てる

Slide 16

Slide 16 text

Actor ❏ Actorを使うとisolateできる UIViewControllerは MainActor(Main threadを 使うグローバルActor) ここもMainActorの領域 (MyActorとは別)

Slide 17

Slide 17 text

Actor ❏ Actorを使うとisolateできる myActorとは別のActorから そのままアクセスできない classはアクセスできる

Slide 18

Slide 18 text

Actor ❏ Actorのプロパティにアクセスするには awaitが必要 awaitを使うことで、順番待 ちをする MainActorをそのまま使っ ている

Slide 19

Slide 19 text

Actor ❏ Actorのプロパティにアクセスするには awaitが必要 awaitを使うことで、順番待 ちをする 同時にcountにアクセスしな くなる = 競合がなくなる

Slide 20

Slide 20 text

ここまでのまとめ ❏ ConcurrencyとActorを使うことで、データ競合に強いコードが書ける ❏ Swift 6ではコンパイル時に上記が保証される

Slide 21

Slide 21 text

Steps to enable Swift 6 mode

Slide 22

Slide 22 text

手順 ❏ Complete checkingに設定する ❏ Swift 6 modeに設定する

Slide 23

Slide 23 text

Strict Concurrency Checking ❏ Start to emit warning about code that is not able to conform to concurrency safe

Slide 24

Slide 24 text

❏ グローバル変数 ❏ どこからでも読み書きできる → データ競合🔥 Var 'XXX' is not concurrency-safe because it is non-isolated global shared mutable state; WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 25

Slide 25 text

❏ グローバル変数 ❏ 定数にする: var → let ❏ @MainActorを付与する ❏ nonisolated(unsafe)を付与する Var 'XXX' is not concurrency-safe because it is non-isolated global shared mutable state; WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 26

Slide 26 text

❏ Call a main actor isolated class method from sync nonisolated context ❏ Concurrencyを使えるようにasyncを追加する or Task で囲む ❏ @MainActorをメソッドに付与する ❏ 呼び出し側もMainActorで呼び出す必要がある Call to actor-isolated instance method in a synchronous actor-isolated context WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 27

Slide 27 text

Call to actor-isolated instance method in a synchronous actor-isolated context ❏ Call a main actor isolated class method from sync nonisolated context ❏ Concurrencyを使えるようにasyncを追加する or Task で囲む ❏ @MainActorをメソッドに付与する ❏ 呼び出し側もMainActorで呼び出す必要がある WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 28

Slide 28 text

❏ Needs to be called from methods on the main actor ❏ ContentView: MainActor ❏ Extension: Call to actor-isolated instance method in a synchronous actor-isolated context WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 29

Slide 29 text

❏ Needs to be called from methods on the main actor ❏ ContentView: MainActor ❏ Extension: Call to actor-isolated instance method in a synchronous actor-isolated context WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 30

Slide 30 text

MainActor annotation ❏ Xcode 16の最新のSDK ❏ より多くのviewのprotocolsが@MainActorになった ❏ 今まで手動でつけてたMainActor消せるかも

Slide 31

Slide 31 text

MainActor-isolated instance method “XXX” cannot be used to satisfy noisolated protocol requirement ❏ nonisolatedをメソッドに付与する ❏ アクターからの孤立ルールから除外する (よくない) →仕方ないケース ❏ @MainActorをDelegateにつける WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 32

Slide 32 text

❏ @preconcurrencyだけでok MainActor-isolated instance method “XXX” cannot be used to satisfy noisolated protocol requirement WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 33

Slide 33 text

Enable Swift 6 mode

Slide 34

Slide 34 text

Tips

Slide 35

Slide 35 text

Callback and completionHandler ❏ Not mentioned about the queue: non-isolated. Cannot access the isolated data ❏ Mentioned: guaranteed WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 36

Slide 36 text

WWDC24. 「Swift 6へのアプリの移行」 . https://developer.apple.com/jp/videos/play/wwdc2024/10169/, (参照 2024-7-11)

Slide 37

Slide 37 text

たくさんの警告が出るけど ❏ 焦らない ❏ 一つ直せば一気にたくさん消える ❏ ゆっくりやる ❏ いくつか修正が難しい実装がでてくるが時間をかけて修正する

Slide 38

Slide 38 text

To be continued…