Construa um suporte para vinhos

Crie um WineRack com as seguintes propriedades:

  • Tem um inicializador padrão que cria um WineRack com uma largura e uma altura especificadas.
  • Tem um inicializador que pode falhar que cria um WineRack com uma largura e uma altura especificadas, preenchido com os vinhos indicados. Os vinhos preenchem o suporte a partir do canto superior esquerdo. Se houver vinhos demais para o tamanho do suporte, o inicializador falhará.
  • Quando um objeto WineRack é impresso, ele exibe uma representação gráfica do suporte usando o símbolo Unicode para um espaço vazio e para um espaço preenchido com vinho.
  • Retorna o vinho em uma determinada posição do suporte usando um subscrito (por exemplo, wineRack[(0,0)]).

Exemplos

print(WineRack(height: 2, width: 3)) ➞
○○○
○○○

print(WineRack(height: 2, width: 3, wines: ["Riesling", "Syrah", "Riesling", "Syrah", "Syrah"])!) ➞
●●●
●●○

WineRack(height: 1, width: 1, wines: ["Riesling", "Syrah"]) ➞ nil

WineRack(height: 2, width: 3, wines: ["Riesling", "Syrah", "Riesling", "Syrah", "Syrah"])?[(0, 0)] ➞ "Riesling"

WineRack(height: 2, width: 3, wines: ["Riesling", "Syrah", "Riesling", "Syrah", "Syrah"])?[(1, 1)] ➞ "Syrah"

WineRack(height: 2, width: 3, wines: ["Riesling", "Syrah", "Riesling", "Syrah", "Syrah"])?[(1, 2)] ➞ nil

Observações

  • As posições de um WineRack que não contêm um vinho devem retornar nil.
  • As posições são representadas por uma tupla com 2 valores: (row, column).
  • Ao imprimir um WineRack, as linhas devem ser separadas por quebras de linha (\n)