【ITニュース解説】SwiftUI Shape vs View

2025年09月10日に「Dev.to」が公開したITニュース「SwiftUI Shape vs View」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

SwiftUIの`Shape`は、色を塗る`.fill()`を適用して初めて表示部品(`View`)になる図形。このため、サイズ指定(`.frame()`)より先に色を塗る必要がある。最初から部品である`View`は直接サイズを指定できる点が異なる。

出典: SwiftUI Shape vs View | Dev.to公開日:

ITニュース解説

SwiftUIでアプリケーションのユーザーインターフェースを構築する際、四角形や円といった基本的な図形を描画する場面は頻繁に発生する。そのために利用されるのがRectangleCircleに代表されるShapeという型である。しかし、このShapeは、テキストを表示するTextや画像を扱うImageのような一般的なViewとは根本的に異なる性質を持っており、その違いを正確に理解することは、SwiftUIを使いこなす上で非常に重要である。

まず、SwiftUIのコード上で単にRectangle()と記述した場合の挙動について考える。多くの場合、開発者は特定の大きさの四角形を意図するが、実際に表示されるのは画面のセーフエリア全体を覆う黒い四角形である。この現象は、Shapeが持つ2つの基本的な特性に起因する。一つ目の特性は、Shapeがその親ビューから提供される空間を可能な限りすべて使用しようとすることである。例えば、VStackの中に直接Rectangle()を配置すると、VStackが利用可能な全領域にわたって四角形が広がることになる。二つ目の特性は、Shapeの色に関する挙動である。Shapeの本質は、色や中身を持たない、純粋な幾何学的な形状、つまり「領域の定義」や「パス」情報に過ぎない。その領域内には何も存在しないため、そのままでは画面上に何も表示されない。そこでSwiftUIは、開発者がその存在を視覚的に認識できるよう、デフォルトで黒色でその領域を塗りつぶして表示する。

このShapeの性質は、一般的なViewとの対比でより明確になる。Viewは、それ自体が初めから表示すべき「コンテンツ」を持っている。例えばTextは表示する文字列を、Imageは表示する画像データをコンテンツとして保持している。一方で、Shapeは前述の通りコンテンツを持たず、あくまで空の領域を定義するだけのものである。この違いは、Shapeをより低レベルで基本的な描画要素と位置づけることができることを意味する。

Shapeを意図した通りに表示するためには、この「空の領域」に対して具体的な見た目を与える操作が必要となる。その役割を担うのが.fill().stroke()といったモディファイアである。例えば、Rectangle().fill(.red)と記述すると、四角形の領域が赤色で塗りつぶされる。ここで最も重要な概念は、.fill()モディファイアを適用した瞬間、Shapeは単なる形状の定義から、具体的な表示内容を持つViewへと変換されるという点である。技術的にはShapeViewという、Viewプロトコルに準拠した特殊なビューが生成される。

このShapeからViewへの変換プロセスを理解することは、モディファイアを適用する順序の重要性を解明する鍵となる。例えば、ビューのサイズをwidthheightで指定する.frame()モディファイアは、Viewに対してのみ適用可能である。Shapeはそれ自体ではViewではないため、Rectangle()に対して直接.frame()を呼び出すことはできない。コードをRectangle().frame(width: 200, height: 200).fill(.red)のように記述するとエラーが発生するのはこのためである。正しい順序は、まず.fill()を適用してShapeViewに変換し、その変換されたViewに対して.frame()でサイズを指定することである。つまり、Rectangle().fill(.red).frame(width: 200, height: 200)という順序で記述する必要がある。これは、「形状を定義し、それに色を塗って具体的なオブジェクト(View)を生成し、そのオブジェクトのサイズを調整する」という論理的な手順に合致している。

対照的に、一般的なViewは最初からViewであるため、.frame()を直接適用してサイズを指定することができる。Viewに色を付けたい場合は.background()モディファイアを使用するが、これはViewの「背景」に色を設定するものであり、Shape.fill()がその形状の「中身」を満たすのとは意味合いが異なる点も区別しておく必要がある。

結論として、SwiftUIにおけるShapeは、それ自体が表示される要素ではなく、表示物の「形」を定義するための設計図のような存在である。.fill().stroke()といったモディファイアを適用することによって初めて、具体的な見た目を持つ描画可能なViewへと実体化する。このShapeからViewへの変換という概念と、それに伴うモディファイアの適用順序のルールを把握することは、SwiftUIでより複雑でカスタム化されたUIを構築していくための基礎となる知識である。