BambooHero

iOSアプリ開発と株式投資をメインに色々書きます

iOSアプリ開発

.alert()の記述箇所を気をつけないと子ビューのアラートが表示されなくなる

親ビューと子ビューそれぞれでアラートを表示する実装がある場合、.alert() Modifierの記述箇所を気をつけないと、子ビューのアラートが表示されなくなります。 正しく表示されるケースの実装はこちらです。 struct ParentView: View { @State var showAlert…

Swiftで[String: Any]型の等価性チェックをする

Swiftで以下のコードはコンパイルエラーになります。 Any型がEquatableに準拠していないというのが理由です。 let dict1: [String: Any] = ["foo": "bar"] let dict2: [String: Any] = ["foo": "bar"] print(dict1 == dict2) // Protocol 'Any' as a type ca…

The Composable Architecture(TCA)で再利用可能なコンポーネントを作る方法

TCAのサンプルの中に Reusable Favoriting Componentというものがあります。 「何かをFavoritingする」という機能を提供する、汎用的なコンポーネントの実装例です。 Getting Startedのサンプルと比べて若干ReducerやStateの書き方が違うので混乱するんです…

Swiftのプロトコルやジェネリクスを駆使して汎用性の高いAPIクライアントを実装する

正直いまだにジェネリクス周りがそんなに得意じゃないのですが、色々苦戦しながらも割と汎用的で使いやすいAPIクライアントをジェネリクスを使って実装することができた気がするので、それについてご紹介したいと思います。 「プロトコルやジェネリクスを駆…

SwiftのComputed PropertiesはFunction内でも宣言できる

今まで知らなくて発見だったのでメモ。 SwiftのComputed PropertiesはFunction内でも宣言できます。 struct State { var foo = "foo" } var state = State() func testComputedProp() { var result: Bool { // ここにComputed Propertiesが宣言できる! some…

UIViewRepresentableなビューにTCAを組み込むべきか?

まだSwiftUIにはUITextView相当のものが用意されていないので、UIViewRepresentableを使ってUITextViewをSwiftUIビューで使用できるようにしています。 さらに、自分が関わっているプロジェクトではThe Composable Architecture(TCA)を採用しているのです…

slatherでiOSアプリのカバレッジを可視化する

Xcodeだけでもカバレッジの数値を見ることはできますが、特定のディレクトリやファイルをカバレッジ対象から除外するなどといった細かいことはできません。 最近業務でiOSアプリのリアーキテクチャを進めているのですが、旧アーキテクチャではテストを全く書…

MintでインストールしたパッケージをBitriseにキャッシュさせる方法

iOSのプロジェクトにSwiftLintを導入していて、SwiftLint自体はMintでインストールしています。 Bitrise上でSwiftLintを実行するためにはビルド前にSwiftLintをインストールしておく必要があるため、Xcode Test for iOSステップの前にScriptステップを配置し…

APIKitのエラーハンドリングを整理する

APIKitではどのようなエラーが定義されていて、それらがどういうときにスローされるかを整理します。 APIKitでAPIClientを実装するときに、エラーハンドリング周りをどう実装するかを考える際の参考になるかと思います。 前提とサンプルコード SessionTaskEr…

isMovingToParentとisMovingFromParent

UIViewControllerのisMovingToParentとisMovingFromParentがどのようなときにtrue or falseになるかがわからなかったので調べてみました。 それぞれの定義 検証してみた まとめ 検証コード それぞれの定義 isMovingToParent A Boolean value indicating whet…

The Composable Architecture(TCA)でアクションシート(Action Sheet)を実装する方法

The Composable Architecture(TCA)のサンプルからアクションシート(Action Sheet)の実装方法について学びます。 今回扱うサンプルはこちらです。 01-GettingStarted-AlertsAndActionSheets 「Action sheet」ボタンをタップするとアクションシートが表示…

The Composable Architecture(TCA)で複数画面で状態を共有する方法

複数画面間での状態の共有をどのように実装するかは、iOSアプリ開発において一つの大きな議論のテーマではないでしょうか? TCAは複数画面間での状態の共有という課題に対してどのようなソリューションを提供するのか、サンプルから学んでいきましょう。 01-…

The Composable Architecture(TCA)でアラート(Alert)を実装する方法

The Composable Architecture(TCA)のサンプルからアラート(Alert)の実装方法について学びます。 今回扱うサンプルはこちらです。 01-GettingStarted-AlertsAndActionSheets 「Alert」ボタンをタップするとアラートが表示され、アラートの中の「Increment…

【UIKit版】The Composable Architecture(TCA)で画面遷移を実装する方法

前回TCAで画面遷移を実装する方法について学びましたが、UIKit版の同様のサンプルも提供されているので、今回はこちらを説明したいと思います。 SwiftUI版との違いに注目して説明するので、是非以下の記事と照らし合わせて見てください。 bamboo-hero.com 対…

【UIKit版】The Composable Architecture(TCA)のカウンターサンプルを理解する

TCAはSwiftUIとの親和性が高いですが、UIKitでも実装が可能です。 TCAではUIKitによる実装サンプルも提供されているので、今回はUIKit版のカウンターサンプルを使ってUIKitでTCAを実装する方法について学びます。 UIKitCaseStudies/CounterViewController Sw…

The Composable Architecture(TCA)で画面遷移を実装する方法

The Composable Architecture(TCA)のサンプルから画面遷移の実装方法について学びます。 今回扱うサンプルは以下の3つです。 01-GettingStarted-OptionalState 03-Navigation-NavigateAndLoad 03-Navigation-LoadThenNavigate Stateがnilとnon-nilのときで…

The Composable Architecture(TCA)におけるBindingの扱い方

The Composable Architecture(TCA)のサンプルからBindingの扱い方について学びます。 今回はCaseStudiesの01-GettingStarted-Bindings-Basicsと01-GettingStarted-Bindings-Formsを例に説明します。 単方向データフローの原則を守る Bindingを使った実装方…

【SwiftUI】画像(Image)のレイアウト方法まとめ

SwiftUIで画像をレイアウトする方法についてまとめました。 画像のレイアウトは4つのメソッドの組み合わせで決まる 各レイアウト方法の比較 参考 画像のレイアウトは4つのメソッドの組み合わせで決まる SwiftUIで画像をレイアウトする際は、以下の4つのメソ…

NotificationCenterでオブザーバのインスタンスが破棄されたらオブザーバも破棄されるよね?の確認

当たり前の話なんですが、PRレビューをしてたときにふと、「あれ、これってremoveObserverしなくて良いんだっけ?」となったので、動作を確認しました。 動作確認用コードの説明 動作確認結果 おわりに 動作確認用コードの説明 以下のように2つの画面があり…

The Composable Architecture(TCA)のサンプルからComposableなArchitectureを学ぶ

前回はTCAの一番単純なサンプルである01-GettingStarted-Counterについて説明しました。 bamboo-hero.com 今回は01-GettingStarted-Composition-TwoCountersについて説明してみます。 小さいモジュールを組み合わせてアプリを構成する Stateのスコープを絞る…

【SwiftUI】Listの使い方と一意性についての注意

SwiftUIでデータをリスト表示するときに使用するListの使い方と、Listを使うときに注意すべきデータの一意性についてまとめました。 Listの使い方 データの一意性を担保する まとめ Listの使い方 人物名をリスト表示する例を取り上げます。 実装はこんな感じ…

The Composable Architecture(TCA)のカウンターサンプルを理解する

先日TCAで簡単なサンプルアプリを作ってみたのですが、まだまだTCAの理解が曖昧なところが多々あるため、もう一度サンプルコードを一から丁寧に読んでいます。 bamboo-hero.com 理解できたところは順次アウトプットしていこうと思います。 まずは、一番単純…

The Composable Architecture(TCA)で簡単なサンプルを作れるようになるまでに辿ったステップ

2日ほどかけてTCA(The Composable Architecture)を使った簡単なサンプルアプリを作りました。 ログインしてホーム画面に遷移するだけの超簡単なサンプルですが、TCAのサンプルコードをずっと眺めているよりも実際にアプリを実装してみたほうが理解もずっと…

SwiftUIでViewを引数として渡せるViewを作る(@ViewBuilder)

以前の記事でナビゲーションバーの色を変更可能にしたNavigationViewの実装方法を紹介しました。 bamboo-hero.com 上記記事では、カスタムModifierを実装し、以下のようにModifierを指定することでナビゲーションバーの色を変更できるようにしました。 Navig…

Codableでプロパティの一部が任意の型になる場合に対応する

とあるAPIのレスポンスをデコードする処理を書いていて、以下のように配列の中の型が複数あるケースに対応する必要がありました。 { "products": [ { "id": 1, "flag": true, "foo": "foofoo", "bar": "barbar" }, { "id": 2, "flag": false, "baz": "bazbaz…

Swift Codableの公式解説をちょっと補足

Codableについての公式の解説記事はこちらですが、JSONの具体例がなかったり読んでるだけだと若干わかりづらいところがあったので、自分なりに補足をつけてみたいと思います。主にCodingKeys周りを見ていきます。 developer.apple.com 具体的なJSONで理解す…

SwiftUIでナビゲーションバー(NavigationView)の色を変更する

現状のSwiftUIではナビゲーションバー(NavigationView)の色を変更するModifierが提供されていません。 しかし、ナビゲーションバーの色を変更したいモチベーションは多々あると思います。 本記事では、ViewModifierを使ってナビゲーションバーのスタイルを…

Carthageに移行したらビルド時間が1.08倍速くなった!

あれ...たったの1.08倍? そう思われると思いますが事実ですw 理由としては、RxSwiftなどビルドに時間がかかるライブラリがCarthageに移行できなかったからですが、このあたりの話も含めてCocoaPods管理からCarthage管理に移行した件について共有させていた…

iOS UIテスト(XCUITest)でアプリとテストランナー間でファイル共有しようと試行錯誤したけどできなかった話

iOS UIテストにて、アプリで保存したファイルの内容をテストコード側で検証したいことがありました。 結論からいうと、シミュレーターではできたけど、実機ではできませんでした。 できなかったけど色々試行錯誤したので、記録として残しておこうと思います…

JSONSerializationでJSONデータを扱う

割とよく書くけど(私が)忘れやすいので、SwiftでJSONファイルを扱う方法についてまとめます。 本記事ではJSONSerializationを取り上げます。 JSONデータ ⇔ オブジェクト変換 ファイルからJSONデータを読み込んでオブジェクトとして取り出す オブジェクトを…