Tipos de coisas em Swift
A regra é:
Instâncias de classe são tipos de referência (ou seja, sua referência a uma instância de classe é efetivamente um ponteiro )
Funções são tipos de referência
Todo o resto é um tipo de valor ; "todo o resto" significa simplesmente instâncias de structs e instâncias de enums, porque isso é tudo que existe no Swift. Arrays e strings são instâncias de struct, por exemplo. Você pode passar uma referência a uma dessas coisas (como um argumento de função) usando inout
e tomando o endereço, como newacct apontou. Mas o próprio tipo é um tipo de valor.
O que os tipos de referência significam para você
Um objeto de tipo de referência é especial na prática porque:
A mera atribuição ou passagem para uma função pode gerar várias referências ao mesmo objeto
O próprio objeto é mutável, mesmo se a referência a ele for uma constante ( let
explícita ou implícita).
Uma mutação no objeto afeta esse objeto como visto por todas as referências a ele.
Esses podem ser perigos, então fique de olho. Por outro lado, passar um tipo de referência é claramente eficiente porque apenas um ponteiro é copiado e passado, o que é trivial.
O que os tipos de valor significam para você
Claramente, passar um tipo de valor é "mais seguro" e let
significa o que diz: você não pode transformar uma instância de struct ou de enum por meio de uma let
referência. Por outro lado, essa segurança é alcançada fazendo uma cópia separada do valor, não é? Isso não torna a passagem de um tipo de valor potencialmente cara?
Bem, sim e não. Não é tão ruim quanto você imagina. Como disse Nate Cook, passar um tipo de valor não implica necessariamente em copiar, porque let
(explícito ou implícito) garante imutabilidade, então não há necessidade de copiar nada. E mesmo passar para uma var
referência não significa que as coisas serão copiadas, apenas que podem ser se necessário (porque há uma mutação). Os médicos aconselham especificamente que você não confunda suas calcinhas.