Como é que o encerramento interage com uma instância de uma estrutura na linguagem de programação?
sobes.tech IA
Resposta da IA
Em Swift, as estruturas são tipos de valor, ou seja, ao passá-las ou atribuí-las, uma cópia da instância é criada. Os closures, capturando variáveis do contexto externo, podem interagir com a instância da estrutura, mas é importante entender que eles capturam cópias dos valores, não a própria instância.
Se um closure captura uma propriedade da estrutura, ele capturará seu valor atual, não uma referência ao original. Portanto, as mudanças dentro do closure não afetarão a instância original da estrutura, a menos que o closure seja marcado como @escaping e trabalhe com parâmetros inout ou referências.
Exemplo:
struct Counter {
var count = 0
mutating func incrementer() -> () -> Void {
return { [self] in
print("Count is \(count)")
}
}
}
var counter = Counter()
let closure = counter.incrementer()
counter.count = 10
closure() // Vai imprimir "Count is 0", porque o closure capturou uma cópia de self
Para que o closure possa modificar o estado da estrutura, é necessário usar inout ou trabalhar com classes (tipos de referência).