Dentro do corpo de uma função, os parâmetros são tratados como constantes, não como variáveis. Tentar modificar o valor de um parâmetro dá origem a um erro de compilação. Se uma função quiser modificar o valor de um parâmetro, tem de usar um parâmetro in-out para tornar essa mutabilidade explícita.
Para usar parâmetros in-out, quem programa tem de garantir três coisas:
inout entre o : e o nome do tipo na anotação de tipo do parâmetro.& na chamada à função, marcando-o explicitamente como modificável.Quando isto se verifica, a função faz uma cópia interna do parâmetro in-out, modifica-a conforme indicado no corpo da função e, quando a função termina, copia o valor modificado de volta para a variável que foi passada.
func updateVersion(_ record: inout (version: Int, title: String)) {
record.version += 1
}
var dbRecord = (version: 2, title: "Exercism")
updateVersion(&dbRecord)
// dbRecord is now (3, "Exercism")
Há mais um par de regras a ter em conta em relação aos parâmetros in-out.
1. Dentro de uma função com parâmetros in-out, não podes referenciar a variável que foi passada como parâmetro in-out.
2. A mesma variável não pode ser passada como vários parâmetros in-out na mesma função.
Por exemplo, `inoutFunc(&mutVar, &mutVar)` dá origem a um erro de compilação.