Shape
SwiftUI nos oferece algumas opções de Shapes para trabalhar inicialmente, que também costumam ser as formas mais utilizadas: Rectangle, Circle, Ellipse, Capsule, RoundedRectangle.
Diferente de Stacks, Shapes (ou Formas), são views que vão se expandir para ocupar o máximo de espaço disponível. Por isso, é comum o método .frame ser utilizado em conjunto com um Shape para que ele seja limitado a uma altura e largura determinada.
Rectangle
Desenha um retângulo com as dimensões especificadas, no centro da view que o contém. Outras views como Stacks e Colors começam como retângulos, mas não se engane, elas não são Shapes.
Circle
Desenha um círculo no centro da view que o contém, porém seu diâmetro corresponderá ao menor valor especificado entre altura e largura, por exemplo, se dado um espaço de 100x50, o círculo final terá apenas 50 de altura e 50 de largura.
Ellipse
Possui um comportamento similar ao Circle, porém não se limita a ter a altura e largura iguais.
Capsule
Cria um Shape em formato de cápsula que vai ter as pontas arredondadas, dependendo de qual eixo (altura ou largura) é maior.
RoundedRectangle
Cria um retângulo que possui os cantos arredondados. Possui dois parâmetros:
cornerRadius: Define o nível de arredondamento das bordas.
style: Define o estilo de arredondamento. Se vai ser o estilo clássico .circular ou o estilo definido pela Apple .continuous.
Customizando um Shape
Existem vários métodos que podem ser utilizados para customizar um Shape além do .frame, então seguem alguns dos mais usados e quais as suas finalidades:
.stroke(lineWidth:)Retorna um novo Shape que é uma cópia do anterior porém com uma borda de tamanho definido por
lineWidth. As vezes pode extrapolar o limite da view por ser uma borda externa.
.strokeBorder(_, lineWidth:)Outra forma de adicionar borda a um Shape, porém com borda interna.
.fill()Permite preencher um Shape com uma cor ou gradiente.
Para demonstrar melhor como os Shapes funcionam, segue um exemplo: