Tipos de cosas en Swift
La regla es:
Las instancias de clase son tipos de referencia (es decir, su referencia a una instancia de clase es efectivamente un puntero )
Las funciones son tipos de referencia
Todo lo demás es un tipo de valor ; "todo lo demás" simplemente significa instancias de estructuras e instancias de enumeraciones, porque eso es todo lo que hay en Swift. Las matrices y cadenas son instancias de estructura, por ejemplo. Usted puede pasar una referencia a una de esas cosas (como un argumento de función) mediante el uso inout
y tomando la dirección, como se ha señalado newacct. Pero el tipo es en sí mismo un tipo de valor.
Qué significan los tipos de referencia para usted
Un objeto de tipo de referencia es especial en la práctica porque:
La mera asignación o el paso a la función pueden producir múltiples referencias al mismo objeto
El objeto en sí es mutable incluso si la referencia a él es una constante ( let
explícita o implícita).
Una mutación en el objeto afecta a ese objeto tal como lo ven todas las referencias a él.
Esos pueden ser peligros, así que esté atento. Por otro lado, pasar un tipo de referencia es claramente eficiente porque solo se copia y pasa un puntero, lo cual es trivial.
Qué significan los tipos de valor para usted
Claramente, pasar un tipo de valor es "más seguro" y let
significa lo que dice: no se puede mutar una instancia de estructura o una instancia de enumeración a través de una let
referencia. Por otro lado, esa seguridad se logra haciendo una copia separada del valor, ¿no es así? ¿No hace eso que pasar un tipo de valor sea potencialmente costoso?
Bueno, sí y no. No es tan malo como podría pensar. Como ha dicho Nate Cook, pasar un tipo de valor no implica necesariamente copiar, porque let
(explícito o implícito) garantiza la inmutabilidad, por lo que no es necesario copiar nada. E incluso pasar a una var
referencia no significa que las cosas se copiarán, solo que pueden serlo si es necesario (porque hay una mutación). Los documentos le aconsejan específicamente que no se tuerza las bragas.