iOSDC day1
TextKit 1 ではレンダリングできない言語があった
TextKit 2 では、抽象化されているので、細かい調整を直接的には API から操作不能に
typographicBounds iOS16 でバグがあったが iOS17 で解消されている
workaround が必要
TextKit 2 でテキストに動画を挟むのが簡単に
挟み込んだ動画が文字列に retain されるのでメモリリーク・循環参照に注意が必要
自動フォールバックで TextKit 1 の API に触れてしまうと TextKit 2 の機能が使えなくなるので注意が必要
TextKit 1 だけなら初期化時に指定する
TextKit 2 を使うなら、 fatalError など利用してデバッグで潰す必要がある
SwiftUI から TextKit を使うのは難しい
選択肢としては、下記のケースがあり、アプリの要件に応じて選択する
- TextKit 1
- TextKit 2
- SwiftUI
TextView は ScrollView
ラクマ
マルチモジュールアーキテクチャへの移行
Swift への移行とリアーキが完了
SwiftUI の拡大と InterfaceBuilder の削除
Swift UI を避ける判断基準
- TextField 系
- Pull to refresh
- スクロールによる追加読み込み(ページングがある検索結果画面など)
interface Builder の削除状況など
統計をとって年間でグラフ化するの良い
こういうのをファイル数ベースでも良いので GitHub の履歴からグラフ化できると面白いかも
マルチモジュールの目的
- 責務の分離
- ローカルテストの高速化
段階的にモジュール分割
- CoreModules
- Repositories
- API Clients
- DataStores
同時並行で柔軟に進めている
効果
- テストカバレッジ向上
Git branch 戦略とリリースプロセスの自動化
- develop/release 運用は並行リリースがつらい
- main branch は tag と冗長
- develop branch 廃止
- pull requests 一覧の取得が困難
- Bitrise でリリースプロセスの自動化で、 GitHub にリリースページを作成する
- Pull Request の作成を GitHub Actions で自動化 <- 真似したい <- セルフ Approve ができる
Documentation
- 仕様の把握漏れ
- 影響範囲が曖昧
- QAが時間かかる
- リリースに時間がかかる
- GitHub Milestone わかりづらい
- iOS, Android の共通の修正がわかりづらい
--
変更の種別で分類
- 新機能
- 不具合
- リファクタリング
今後のリリース作業で PM との認識合わせにも有効そう
Impact Level
影響範囲を明示的にする
Swift Macros
Swift 5.9 から
ツリー構造を調べる便利なツール
Swift Syntax からソースコードを生成する利点
- コメントを回避できる trivia
- 構造的にマッチングする
- 部分的な書き換えができる
最小単位
構造の走査は SyntaxVisitor に任せる
便利な SyntaxVisitor として Any が用意されてる
書き換え用に SyntaxRewriter
visit で返す TokenSyntax を書き換える
構文解析できないものは、 SwiftSyntax でも解析できない
コンパイラによって決まるものは判別できない
Swift Lint
Swift Marcos が使える
Swift の言語仕様
Swift Lint に修正 PR
SwiftSyntax 文字数は UTF8 のバイトサイズなので注意する
Swift Macros 入門
- Swift-Lint がわかりやすい
- Swift AST Explorer に入力して出力を見てもらうとどうやって解析されるのかイメージが掴める
Actor で CoreData をスレッドから解放しよう
- Swift Concurrency + Core Data
- スレッド違反をコンパイル時にチェック
スレッドセーフではなく、生成したスレッド以外からアクセスできない
Actor にすれば解決、するわけではない
Actor はスレッド同一性を保証しない
Managed Object が生成スレッド以外に持ち出される
NSManagedObjectID を使う
- 型情報がない
- 毎回 fetch が必要
- Sendable
- Managed Object は発行元の MOC と同一スレッド
Sendable
NSManaged Object やその Context は Sendable ではない
Global actor
Non-sendable を Sendable にできる
同一スレッドを保証するために
Actor はデータ競合が発生しないことを保証し、実行単位の Job がどのスレッドで動くかに関与しない
Executor で Job 実行をカスタマイズできる
まだ Beta
交通シミュレーションゲーム気になる
座談会
- パートナーと交代で時間を作る
- キッズスペース
- リサイクルボックス
- 子どものライフサイクルに合わせて仕事の時間を調整
最近思うのは、
リモートワークで仕事部屋に子どもが入ってくるのではなく、
家族の空間に仕事をしている人がいる
と自覚するのが大事だと思い始めた
Dolby Atmos
xR と相性が良さそう
オーディオの基礎知識が必要
- モノラル
- ステレオ
- Equal Power Panning
- 仮想的な音の位置を変化させることができる
- マルチチャンネル
- 4 ch 映画
- 5 ch サラウンド分離
- 5.1 ch 低音成分の分離
- 低音は人は聞きにくい
- 音割れしやすい
- 指向性がない
- 6.1 ch バックが増える
- 7.1 ch さらに増える
スピーカーの設置は大変
オブジェクトベースオーディオ
- 音の位置をリアルタイムに計算
- スピーカー向けレンダリング
- ヘッドフォン向けレンダリング
- 耳の入り口をシミュレートできれば再現できるという考え
オーディオ形式
- Dolby Atmos
- DTS:X - Blu-ray
- 260 Reality Audio - Sony - 足元を含む全方位からの音に対応
オーディオは下位互換を大事にしている
アプリで空間オーディオを利用する API
<video>
タグ
コンテンツを空間化して良いかのプロパティ
動的にレンダリングするので音量を揃えておく必要がある
内臓スピーカー対応は iPhone Xs から
find a key moment
Capabitities の登録必須
代替になる
completion handler が使えないが Wrapper を作って解消する
- 別プロセスのため、オーバヘッドが発生
- 動作確認が大変
exit(0)
で終了 - Xocde デバッガ以外で通信を監視
- wait for the executable to be launched
非同期処理データの状態管理
- ロード中
- 成功
- 失敗
これらの組み合わせがありえる
- enum
- Component
enum 導入前は、状態管理の変数とその管理が煩雑になる
組み合わせ爆発が起こりやすい
成功、エラーとロード中の状態の組み合わせを表現する
.reLoading(V)
, .retryLoading(E)
を用意する
enum の合成みたいなのができると良さそうだけど
loading がどこからの遷移からで詳細に定義し直す
StateMachine でやることの簡略化とも言えそう
enum を引数にとるコンポーネント
アプリの要件に合わせて責務の境界をコントロールできる
こういう設計をチームの状態に合わせてコントロールできると良さそう
enum だけだとボイラープレートが増える
コンポーネントを利用してボイラープレートを削除する