Nesse artigo iremos abordar o funcionamento do struct
, ou em português estruturas, no Solidity.
Struct (Estruturas)
Uma estrutura pode ser definida com a sintaxe struct Nome
, dessa forma você pode criar seu próprio objeto com atributos personalizados.
São muito úteis para agrupar dados relacionados.
As estruturas podem ser declaradas fora de um contrato e importados para qualquer outro contrato.
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract Todos {// Declaração de uma struct 'Todo' dentro do contratostruct Todo {string text;bool completed;}// Declaração de uma array do tipo 'Todo'Todo[] public todos;function create(string calldata _text) public {// 3 formas de inicializar uma estrutura// - passando os valores '_text' e 'false' como parâmetrotodos.push(Todo(_text, false));// passando os valores nas chaves definidastodos.push(Todo({text: _text, completed: false}));// inicializando vazio e depois atualizando o valorTodo memory todo;todo.text = _text;// todo.completed - por padrão inicializa como falsetodos.push(todo);}// Solidity cria automaticamente um getter para objetos da array 'todos' então// você realmente não precisa dessa função.function get(uint _index) public view returns (string memory text, bool completed) {Todo storage todo = todos[_index];return (todo.text, todo.completed);// Outra maneira de retornar os valores acima seria:// return (todos[_index].text, todos[_index].completed);}// Atualizando o valor da variável text de um determinado 'todo'function updateText(uint _index, string calldata _text) public {Todo storage todo = todos[_index];todo.text = _text;}// Atualizando o valor da variável completed de um determinado 'todo'function toggleCompleted(uint _index) public {Todo storage todo = todos[_index];todo.completed = !todo.completed;}}
Declarando e importando uma struct
Arquivo em que a struct é declarada
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;// This is saved 'StructTodo.sol'struct Todo {string text;bool completed;}
Para importarmos a struct
, precisamos fazer o import do arquivo que salvamos anteriormente
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;import "./StructTodo.sol";contract Todos {// Uma array de estrutura 'Todo'Todo[] public todos;}