• ¿Qué es un lenguaje de programación?
  • Entorno de Desarrollo en macOS
WeiseRatel
  • ¿Qué es Swift?
  • ¿Hablamos?
  • Sobre WeiseRatel.com
No Result
View All Result
  • ¿Qué es Swift?
  • ¿Hablamos?
  • Sobre WeiseRatel.com
No Result
View All Result
WeiseRatel
No Result
View All Result
Home Lenguajes de Programación Swift

Swift – Copy On Write

Josué V. Herrera by Josué V. Herrera
in Swift
Reading Time: 4 mins read
A A
Copy on Write, Swift
11
SHARES
36
VIEWS
Compartir en FacebookCompartir en Twitter

En esta ocasión aprenderemos sobre una característica bien interesante del lenguaje Swift llamada Copy on Write (copia al escribir), y que se implementa sobre los tipos por valor.

[better-ads type=’banner’ banner=’159′ ]

A favor de lograr entender del todo lo que comentaremos aquí, me gustaría recomendar la lectura del artículo donde hablamos sobre los tipos por referencia y los tipos por valor en el lenguaje de programación Swift.

No obstante recordemos brevemente:

A diferencia de los tipos por referencias, donde dos instancias pueden compartir el mismo segmento de memoria. Los tipos por valor son inmutables por efecto, y cada vez que asignamos un valor o igualamos una variable con otra. Comienza todo un proceso de asignación e inicialización de memoria, que en dependencia del tamaño del dato puede consumir más o menos recursos de nuestro dispositivo.

¿Qué es el Copy on Write?

La característica (o comportamiento) Copy on Write es muy ingeniosa, y viene a reducir grandemente el costo en recursos al interactuar con arreglos o diccionarios.

La funcionalidad Copy on Write es bien sencilla de entender, y consiste en lo siguiente:

Al efectuar una asignación de un arreglo sobre otro, o de un diccionario a otro: no se asigna un nuevo espacio de memoria, se opta por compartir el mismo segmento de memoria. ¿Qué sentido tiene almacenar en memoria dos arreglos o diccionarios que son idénticos?

[better-ads type=’banner’ banner=’160′ ]

Luego, cuando este valor común (del arreglo o del diccionario) es modificado, es cuando realmente se copia el valor modificado a un nuevo segmento de memoria.

En palabras de C++ eso sería básicamente declarar un puntero a la dirección de memoria de la variable que ya tenemos, y de esta manera compartir el valor común que hasta ese momento tienen asignado dicho segmento de memoria, y al cual apuntan ambas variables.

Ejemplo

Veamos un ejemplo en código para entenderlo aún mejor:

//
// Función de ayuda
//

func address(of object: UnsafeRawPointer) -> String {
    
    let address = Int(bitPattern: object)

    return String(format: "%p", address)

} // address

// Inicio del código de ejemplo 👇

//
// Creamos el primer arreglo y le asignamos un valor
//

var firstArray = [10]

//
// Imprimimos la dirección de memoria de firstArray
//

print("1 -  firstArray: \(address(of: &firstArray))")

//
// Creamos el segundo arreglo igualándolo al primero
//

var secondArray = firstArray

//
// Imprimimos la dirección de memoria de secondArray
// que en este momento es la misma de firstArray
//

print("2 - secondArray: \(address(of: &secondArray))")

//
// Ahora mutamos el valor de firstArray agregándole un nuevo valor (5). Siendo ahora igual a [10, 5]
//

firstArray.append(5)

print("\n¡Arreglo modificado!\n")

//
// Veamos como han cambiado las direcciones de memoria, en este caso la de firstArray
//

print("1 -  firstArray: \(address(of: &firstArray))")
print("2 - secondArray: \(address(of: &secondArray))")

La salida en pantalla (en mi ordenador) del ejemplo sería la siguiente:

1 -  firstArray: 0x60000076baa0
2 - secondArray: 0x60000076baa0

¡Arreglo modificado!

1 -  firstArray: 0x60000074cd70
2 - secondArray: 0x60000076baa0

Beneficios

Como podemos observar en el ejemplo (solo imaginemos que es un arreglo de 100 elementos o más) luego de igualar secondArray con firstArray ambas variables comparten la misma dirección de memoria.

Nos hemos ahorrado (de momento) el consumo de recursos asociado al proceso de asignación de memoria.

[better-ads type=’banner’ banner=’161′ ]

Pero no termina aquí, si en este punto verificamos si ambos arreglo son idénticos mediante el operador de igualdad (==). Swift ni se molesta en ejecutar la comparación, ya que al ver que ambas variables comparten la misma dirección de memoria, pues es lógico asumir de que el valor almacenado será el mismo.

Una vez que modificamos el valor pasamos a trabajar con dos valores distintos, y por ende toma sentido diferenciar ambas variables y es necesaria la creación de un segundo segmento de memoria.

Conclusiones

No creo que haya mucho más que explicar, creo que el ejemplo de código ya se explica de por sí. No obstante ante cualquier duda ahí están los comentarios.

Solo aclarar (nuevamente) de que esta característica solo está disponible para los tipos Array y Dictionary.

☝️ Luego me dicen que lo probaron con un Int y nos les funciona. 🤷‍♂️

Tampoco se aplica sobre el resto de tipos de datos y tampoco para los nuestros propios. Aunque ya hemos visto como podemos solucionar esto último.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo y síguenos en nuestras redes sociales. Mantente al tanto de todas nuestras publicaciones.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

¡Cualquier duda o sugerencia, ya sea errores a corregir o ejemplos a añadir, será más que bienvenida, necesaria!

Josué V. Herrera

Josué V. Herrera

Desarrollador Swift / iOS. Llevo en el mundo de la informática más de 15 años, trabajado con varios lenguajes de programación y frameworks como Swift, C++ / Qt, C#, Java, entre otros. También he fungido como administrador de redes, bases de datos y sistemas Linux (algún que otro BSD) desde 2005 hasta la actualidad. Soy “Experto en Administración y Seguridad de Redes” por la Universidad Tecnológica Nacional FRVM de Córdoba, Argentina.

Artículos relacionados

La Sentencia Guard, Swift
Swift

Swift – La Sentencia Guard

Funciones de Órden Superior, Swift
Swift

Swift – Funciones de Órden Superior

¿Cómo iterar sobre tipos de datos propios?, Swift
Swift

Swift – ¿Cómo iterar sobre tipos de datos propios?

Trabajo con Fechas, Swift
Swift

Swift – Trabajo con Fechas

Load More
0 0 votos
Article Rating
Suscríbete
Login
Notificar de
guest

guest

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

0 Comments
Inline Feedbacks
Ver todos los comentarios

Suscríbete

Únete!

Únete!

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!

Entradas recientes

  • Estructuras de Datos – Lista Enlazada
  • MariaDB – Comandos Básicos
  • MariaDB – Instalación y Configuración
  • ¿Cómo hacer una instalación limpia de macOS Ventura?
  • Git – Instalación y Configuración

Categorías

  • Bases de Datos (2)
    • MariaDB (2)
  • Estructuras de Datos (3)
  • Gestión de Dependencias (2)
    • Swift Package Manager (2)
  • Git (2)
  • Guías (2)
  • Lenguajes de Programación (27)
    • Swift (27)
  • Sobre WiseRatel.com
  • Política de Privacidad
  • Política de Cookies
  • ¿Hablamos?
Powered by humans!

© 2022 WeiseRatel. All Rights Reserved.

No Result
View All Result
  • ¿Qué es Swift?
  • ¿Hablamos?
  • Sobre WeiseRatel.com

© 2022 WeiseRatel. All Rights Reserved.

wpDiscuz
RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!

Cookies Para que este sitio funcione adecuadamente, a veces instalamos en los dispositivos de los usuarios pequeños ficheros de datos, conocidos como cookies. La mayoría de los grandes sitios web también lo hacen.
Aceptar cookies
Leer más
Ajustes de cookies
Configuración de Cookie Box
Configuración de Cookie Box

Ajustes de privacidad

Decida qué cookies desea permitir. Puede cambiar estos ajustes en cualquier momento. Sin embargo, esto puede hacer que algunas funciones dejen de estar disponibles. Para obtener información sobre eliminar las cookies, por favor consulte la función de ayuda de su navegador. MÁS INFORMACIÓN SOBRE LAS COOKIES QUE USAMOS.

Con el deslizador, puede habilitar o deshabilitar los diferentes tipos de cookies:

  • Block all
  • Essential
  • Functionality
  • Analytics
  • Advertising

Este sitio web

  • Esencial: Recordar sus ajustes de permisos de cookies
  • Esencial: Permitir cookies de sesión
  • Esencial: Recopilar la información que introduzca en el formulario de contacto de un boletín informativo y otros formularios en todas las páginas
  • Esencial: Hacer un seguimiento de lo que introduzca en la cesta de la compra
  • Esencial: Verificar que ha iniciado sesión en su cuenta de usuario
  • Esencial: Recordar la versión del idioma seleccionado

Este sitio web no

  • Recordar los datos de inicio de sesión
  • Funcionalidad: Recordar los ajustes de redes sociales
  • Funcionalidad: Recordar el país y la región seleccionados
  • Análisis: Hacer un seguimiento de las páginas visitadas y de la interacción en las mismas
  • Análisis: Hacer un seguimiento de la ubicación y la región según la dirección IP
  • Análisis: Hacer un seguimiento del tiempo pasado en cada página
  • Análisis: Aumentar la calidad de los datos de las funciones estadísticas
  • Publicidad: Adaptar la información y la publicidad a sus intereses según, p.ej., el contenido que ha visitado antes. (Actualmente no usamos segmentación ni cookies de segmentación)
  • Publicidad: Recopilar información personalmente identificable como el nombre y la ubicación

Este sitio web

  • Esencial: Recordar sus ajustes de permisos de cookies
  • Esencial: Permitir cookies de sesión
  • Esencial: Recopilar la información que introduzca en el formulario de contacto de un boletín informativo y otros formularios en todas las páginas
  • Esencial: Hacer un seguimiento de lo que introduzca en la cesta de la compra
  • Esencial: Verificar que ha iniciado sesión en su cuenta de usuario
  • Esencial: Recordar la versión del idioma seleccionado
  • Funcionalidad: Recordar todos los ajustes de redes sociales
  • Funcionalidad: Recordar el país y la región seleccionados

Este sitio web no

  • Análisis: Hacer un seguimiento de las páginas visitadas y de la interacción en las mismas
  • Análisis: Hacer un seguimiento de la ubicación y la región según la dirección IP
  • Análisis: Hacer un seguimiento del tiempo pasado en cada página
  • Análisis: Aumentar la calidad de los datos de las funciones estadísticas
  • Publicidad: Adaptar la información y la publicidad a sus intereses según, p.ej., el contenido que ha visitado antes. (Actualmente no usamos segmentación ni cookies de segmentación)
  • Publicidad: Recopilar información personalmente identificable como el nombre y la ubicación

Este sitio web

  • Esencial: Recordar sus ajustes de permisos de cookies
  • Esencial: Permitir cookies de sesión
  • Esencial: Recopilar la información que introduzca en el formulario de contacto de un boletín informativo y otros formularios en todas las páginas
  • Esencial: Hacer un seguimiento de lo que introduzca en la cesta de la compra
  • Esencial: Verificar que ha iniciado sesión en su cuenta de usuario
  • Esencial: Recordar la versión del idioma seleccionado
  • Funcionalidad: Recordar todos los ajustes de redes sociales
  • Funcionalidad: Recordar el país y la región seleccionados
  • Análisis: Hacer un seguimiento de las páginas visitadas y de la interacción en las mismas
  • Análisis: Hacer un seguimiento de la ubicación y la región según la dirección IP
  • Análisis: Hacer un seguimiento del tiempo pasado en cada página
  • Análisis: Aumentar la calidad de los datos de las funciones estadísticas

Este sitio web no

  • Publicidad: Adaptar la información y la publicidad a sus intereses según, p.ej., el contenido que ha visitado antes. (Actualmente no usamos segmentación ni cookies de segmentación)
  • Publicidad: Recopilar información personalmente identificable como el nombre y la ubicación

Este sitio web

  • Funcionalidad: Recordar los ajustes de redes sociales
  • Funcionalidad: Recordar el país y la región seleccionados
  • Análisis: Hacer un seguimiento de las páginas visitadas y de la interacción en las mismas
  • Análisis: Hacer un seguimiento de la ubicación y la región según la dirección IP
  • Análisis: Hacer un seguimiento del tiempo pasado en cada página
  • Análisis: Aumentar la calidad de los datos de las funciones estadísticas
  • Publicidad: Adaptar la información y la publicidad a sus intereses según, p.ej., el contenido que ha visitado antes. (Actualmente no usamos segmentación ni cookies de segmentación)
  • Publicidad: Recopilar información personalmente identificable como el nombre y la ubicación

Este sitio web no

  • Recordar los datos de inicio de sesión
Guardar cerrar