🐼

SwiftUI に関する一般的な誤解

2024/07/25に公開1

SwiftUI は Apple が積極的に推進している宣言型フレームワークであり、設計理念は従来の UIKit/AppKit とは顕著に異なります。さらに、他の宣言型フレームワークと比較しても、SwiftUI は多くの独自の機能と動作ロジックを示しています。多くの SwiftUI 開発者との交流を通じて、私はかなりの数の人がこのフレームワークに対して誤解を持っており、これらの誤解が SwiftUI の本質を深く理解する妨げになっていることに気付きました。

この記事では、いくつかの一般的な誤解を探求し、開発者が SwiftUI をより良く理解し、活用できるよう支援することを目的としています。SwiftUI 学習の難易度に対する認識、クロスプラットフォーム開発の期待、フレームワークの機能の範囲、コード量に関する誤解など、これらの誤解を分析します。これらの観念を明確にすることで、SwiftUI 開発者に対してより明確な学習方向と使用戦略を提供したいと考えています。

この原文は私のブログ Fatbobman's Blog に掲載されています。Swift、SwiftUI、Core Data、SwiftData に関する最新のアップデートや優れた記事をお見逃しなく。Fatbobman's Swift Weekly に登録して、毎週の洞察と貴重なコンテンツを直接メールボックスにお届けします。

SwiftUI は簡単に学べて使いやすい?

SwiftUI を紹介する多くの文書や書籍は、読者に強い印象を与えるために、簡潔で理解しやすいビューコードを示し、SwiftUI の強力な宣言型レイアウト機能を際立たせることがよくあります。このアプローチは効果的ですが、初心者に誤った認識を与える可能性があります。

確かに、初心者にとっては、数時間の学習で以前はもっと長い時間をかけて完成させていたビューやインタラクションを独立して作成できることは非常に魅力的です。しかし、この迅速な習得の便利さは、SwiftUI が簡単に学べて使いやすいという錯覚を生むことがあります。

この錯覚を生む主な理由は2つあります。第一に、Swift 言語のいくつかの高度な機能により、SwiftUI のビュー宣言がより簡潔に見えることです。第二に、Apple が多くの API を高度に抽象化し、封装しているため、初心者が簡単なシナリオを処理する際に簡単に実現できることです。

しかし、開発者が複雑なレイアウトやインタラクションに直面するとき、SwiftUI の独自のレイアウトロジックや内部動作メカニズムを深く理解していないと、これらの「簡単な」API を使って正確に要求を表現することができません。この場合、一部の開発者は SwiftUI の能力が限られていると誤解し、フレームワークの理解が不足していることに気付かない可能性があります。

SwiftUI のもう一つの特徴は、多くのコンポーネントやコードが異なるコンテキストで異なる挙動を示すことです。Apple がレイアウトコンテナやコンポーネントに大量のデフォルト動作を提供する意図は、使用の敷居を下げるためですが、これが混乱を招くこともあります。予期しない動作に直面したとき、開発者はそれを SwiftUI のバグと誤解し、回避策を探すことがありますが、実際にはデフォルトルールの理解不足が原因です。

したがって、開発者は SwiftUI を初歩的に理解した後、基盤となる実装原理、特にレイアウトロジックやレスポンスメカニズムなどの核心概念を積極的に学び、SwiftUI の全体的な理解を深めるべきです。

SwiftUI の学習曲線は非常に不均衡です。入門(より正確には使用を開始すること)は確かに比較的容易ですが、それを本当に使いこなす(ましてや熟練する)ことは非常に挑戦的です。SwiftUI は初心者に非常にフレンドリーなフレームワークと言えますが、その複雑性について深く掘り下げた記事が不足しており、多くの開発者がその実際の限界に気付いていないため、SwiftUI を本当にマスターすることは難しいです。

Write Once, Run Anywhere?

SwiftUI は Apple のエコシステム内のすべてのプラットフォームをサポートしており、これが最大の魅力の一つとされています。しかし、開発者が実際に SwiftUI を使ってクロスプラットフォームアプリケーションを構築し始めると、現実と最初の想像との間にかなりのギャップがあることに気づくことがよくあります。

実際の開発では、開発者は多くの挑戦に直面します。たとえば、多くの修飾子には特定のプラットフォーム制限があり、同じコードが異なるプラットフォームで全く異なる動作を示すことがあります。このような状況に直面したとき、開発者は Apple の約束がただの夢物語に過ぎないのではないかと疑問に思うかもしれません。「Write Once, Run Anywhere」という広く知られたスローガンはどこに行ったのでしょうか?

実際、SwiftUI の誕生当初から、Apple はその理念が「Write Once, Run Anywhere」ではなく、「Learn once, apply anywhere」であることを明言しています。この微妙だが重要な違いは、Apple の本当の意図を明らかにします。彼らは、開発者に SwiftUI フレームワークの核心原理を深く理解させ、異なるプラットフォームのハードウェア特性やユーザー習慣に応じてこれらの知識を柔軟に適用し、最適なユーザー体験を創出することを奨励しています。

この理念は開発者に対してより高い要求を課します。クロスプラットフォームプロジェクトを開発したり、既存のプロジェクトをさらに多くのプラットフォームに拡張したりする際には、各コンポーネントが異なるプラットフォームでどのように具体的に機能するか、各プラットフォームの固有の API 特性について深く理解する必要があります。この方法は一見より複雑に見えますが、各プラットフォームの利点をより正確に活用することができます。

異なるフレームワークを使用して各プラットフォームアプリケーションを個別に開発する従来の方法と比較して、SwiftUI のクロスプラットフォーム開発アプローチはより多くの事前準備を必要とします。開発者はカスタムタイプや再封装などの技術を通じて、多プラットフォームコードの再利用の準備を整える必要があります。この方法は初期投資が大きいですが、長期的にはより柔軟でプラットフォーム特性に富んだアプリケーションの構築に役立ちます。

この開発方法は単純な「Write Once, Run Anywhere」の理念よりもはるかに複雑ですが、顕著な利点ももたらします。この方法を通じて、開発者は異なるプラットフォームの特性に合わせてコードを最適化し、各プラットフォームの特徴に合ったアプリケーションを創出することができ、アプリケーションのプラットフォーム属性を強化します。

SwiftUI のクロスプラットフォーム開発理念は、より多くの努力を必要としますが、それによってより優れた、各プラットフォームの特性に合ったユーザー体験を提供することができます。これを理解し受け入れることは、SwiftUI を使ってクロスプラットフォーム開発を行う上で非常に重要です。

SwiftUI:単なる UI フレームワークを超えて

技術的に見れば、SwiftUI は確かに宣言型の UI フレームワークです。しかし、それを単なる UI フレームワークと見るのは不十分です。SwiftUI は Swift 言語の多くの新機能と密接に関連しており、Apple が SwiftUI を設計する際には将来の開発トレンドや開発者エコシステムを考慮していることは明らかです。したがって、SwiftUI を真に習得するためには、より包括的な視点で考える必要があります。

SwiftUI をうまく使いこなすためには、少なくとも以下の内容を習得する必要があります:

  • Swift の現代的な並行処理モデル
  • Swift Package Manager (SPM) の熟練使用
  • 古いバージョンのシステムと互換性が必要な場合には Combine フレームワークの知識

最も重要なのは、新しい視点で SwiftUI プロジェクトを構築することで、プロジェクトの実行効率、拡張性、信頼性などの側面を確保することです。つまり、アプリケーションアーキテクチャや開発プロセスを再考する必要があります。

興味深いことに、公式に推奨されるデータフロー管理方法を持つ他の UI フレームワークとは異なり、Apple は SwiftUI に標準のデータ管理テンプレートを提供していません。このアプローチは開発者に大きな自由度を与えますが、一部の開発者にとってはどこから手を付けるべきか分からず困惑することがあります。

実際、SwiftUI のレスポンスメカニズムや Swift 言語が提供するさまざまな通知メカニズムを理解すれば、どのデータフロー管理方法を採用しても、SwiftUI で良好な結果を得ることが可能です。しかし、これにより開発者にはより高い要求と挑戦が課されます。

特に、特殊またはエッジケースの状況では、レスポンスやメモリ解放などの挙動が開発者の直感や期待と異なる場合があります。これにより、開発者は包括的かつ深い知識構造を持って SwiftUI を真正に使いこなす必要があります。

SwiftUI は単なる UI フレームワークではなく、新しいアプリケーション開発のパラダイムに似ています。アプリケーションの構築方法、データフローの管理方法、パフォーマンスの最適化方法を再考することを要求します。この新しい思考方法を受け入れて実践することで、SwiftUI の潜在能力を最大限に引き出し、高効率で安定した魅力的なアプリケーションを創出できるようになります。

SwiftUI:コードを少なくすることが目的ではない

多くの SwiftUI 宣伝資料が「Less Code」を強調していますが、これは「コードを少なく書く」ことが SwiftUI の核心目標であることを意味するわけではありません。実際、多くのケースで、より多くのコードがより良い結果をもたらすことがあります。

他の宣言型フレームワークと比較して、SwiftUI は基礎ビューを宣言する際に通常より簡潔で少ないコードを使用しますが、簡潔さは必ずしも効率性を意味するわけではなく、唯一の目標であってはなりません。

より多くのコードが良い結果をもたらす理由:

  • パフォーマンスの最適化:頻繁に変化するビューに struct を使用し、SwiftUI のビュー最適化メカニズムを最大限に活用する。
  • コンパイル効率と成功率の向上:大型ビューを複数の小さなビューに分割し、コンパイル時間を短縮し、型推論の問題を回避する。
  • マルチプラットフォーム適応性の向上:カスタムタイプや再包装を通じて、コードのクロスプラットフォーム互換性を向上させる。
  • コード構造とテスト性の改善:複雑なビューの状態を抽象化し、ビューコードを簡素化し、個別の状態テスト能力を提供する。
  • モジュール化と保守性の向上:SPM を使用してビューコードとデータ管理やその他のライブラリを分離し、コンパイル効率を向上させるとともに、プレビューの成功率を大幅に改善する。

SwiftUI の真の利点はコード量を減らすことではなく、適切なコード構造とベストプラクティスを通じて、効率的で安定した拡張可能なアプリケーションを作成することにあります。開発者はコード量とこれらの重要な目標を天秤にかけるべきであり、単に「コードを少なくする」ことを追求すべきではありません。

結論

この記事では、SwiftUI 開発者の間でよく見られる誤解について探討しました。具体的な技術的解決策は提供しませんでしたが、これらの観念を再考することで、開発者が SwiftUI の本質と潜在能力をより良く理解する手助けができることを願っています。

SwiftUI に対する認識と期待を再調整することで、開発者は学習と使用中に直面する挑戦によりよく対処できるようになるでしょう。これにより、開発体験の改善だけでなく、SwiftUI の潜在能力を最大限に引き出し、高品質なアプリケーションを作成する助けとなることを期待しています。

Discussion