• ¿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 – Modificadores de Acceso

Josué V. Herrera by Josué V. Herrera
in Swift
Reading Time: 7 mins read
A A
Modificadores de Acceso, Swift
11
SHARES
36
VIEWS
Compartir en FacebookCompartir en Twitter

Hoy aprenderemos sobre el control de acceso en el lenguaje Swift. ¿Qué elementos de nuestro código serán privados? ¿Qué funcionalidades de nuestros objetos estarán disponibles en su interfaz publica y cuales no?

Esta es una característica que se encuentra en la mayoría de los lenguajes de programación modernos, por no decir en todos. La razón detrás de su existencia reside en la necesidad de proteger ciertos segmentos del código que no necesitan estar expuestos a que por equivocación sean modificados desde otras áreas de nuestra aplicación.

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

Por ejemplo, supongamos que tenemos una propiedad que es usada solamente dentro de la definición de clase y deseamos que esta no pueda ser visible desde el exterior.

Pues mediante los distintos niveles de acceso con los que contamos en Swift podemos administrar la visibilidad de esta propiedad y ocultarla a otras áreas del programa. Es decir, como este método no está concebido para interactuar con los clientes de la clase o estructura que lo define, abogamos por encapsularlo y limitar el acceso externo.

Modulos y Códigos Fuente

El Control de Acceso se organiza en dos importantes conceptos que están relacionados: los módulos y los códigos fuentes. Un módulo es una unidad de código que se desarrolla y se distribuye como un todo, puede ser tanto un framework como una aplicación que luego puede ser importado por cualquier otro módulo haciendo uso de la palabra clave import.

Para entender mejor esto hagamos referencia a algo que imagino todos recordaran haber visto: import UIKit o import Cocoa al inicio de los playgrounds o de cualquier código fuente, pues estos son frameworks que agrupan una serie de tipos y funcionalidades relacionadas. Por ejemplo, UIKit es un framework diseñado para facilitar el desarrollo de las interfaces gráficas de usuario.

Los códigos fuentes por su parte, constituyen una unidad más discreta, que representa un archivo y forman parte de un módulo específico. Con respecto a esto último sería bueno agregar que se considera una buena práctica definir un solo tipo por cada código fuente, esto no es obligatorio pero ayuda a mantener el proyecto organizado.

Niveles de Acceso

En el lenguaje Swift contamos con tres niveles de acceso:

Nivel de AccesoDescripción
PublicEl acceso público hace que las entidades sean visibles a todos los archivos en el módulo o a aquellos que hayan sido importados por el módulo.
InternalEl acceso interno (por defecto) hace que las entidades sean visibles a todos los archivos en el mismo módulo.
Private El acceso privado hace las entidades visibles solamente dentro del archivo de código fuente donde este se define.

En general, el nivel de acceso que utilicemos debe de ser consistente a su vez con el nivel de acceso de sus propiedades y métodos. Una propiedad no puede tener un nivel de acceso menos restrictivo que su propio tipo.

Por ejemplo una propiedad con un nivel de control de internal no puede ser declarada en un tipo con acceso private. Igualmente, el modificador de acceso aplicado sobre una función no puede ser menos restrictivo que el modificador utilizado para sus parámetros. Lógicamente si violamos estos requerimientos, el compilador nos mostrará un error.

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

Como ya hemos comentado el nivel de acceso por defecto que establece Swift para nuestras aplicaciones es internal. Este hecho permite que no sea necesario especificar de manera explícita el nivel de acceso de cada tipo, propiedad y método en el código. Dicho esto solamente tendríamos que especificar el control de acceso cuando sea necesario especificar public y private.

Veamos un ejemplo práctico:

//: Playground - noun: a place where people can play

import Cocoa

class SomeClass {
    
    private var someValue: String?
    
    final func isEmpty() -> Bool {
        
        if someValue != nil {

            return false
            
        } // if
        
        return true
        
    } // isEmpty
    
} // SomeClass

let myClass = SomeClass()

print(myClass.isEmpty())

la salida en pantalla sería:

true

Aquí tenemos un código bastante trivial, sencillo. En la línea 7 establecemos la propiedad opcional someValue como privada en pos de que solamente se pueda interactuar con ella desde el interior de la clase o desde el mismo archivo donde esta se define.

Como parte de esta clase también contamos con un método llamado isEmpty, su función consiste en verificar si la propiedad someValue cuenta con un valor asignado o aún está vacía. Esto último pudiera también ser dicho como que nos encontramos verificando si aún esta propiedad es igual a nil.

A través de este método los clientes de la clase delegan la verificación en nosotros y al mismo tiempo creamos una interfaz entre ellos y la propiedad privada, evitando así que esta puede ser tratada de manera que no consideramos segura.

Pero hay un problema en este código, no podemos leer ni modificar el valor almacenado en la propiedad someValue, aún no hemos creado una interfaz para esto, algo que pudiéramos implementar de distintas maneras en dependencia de la necesidad. Acceder directamente no es posible así que tendríamos que crear un método que nos permita lograrlo.

¿Qué otra opción tendríamos?

Pues a mi modo de ver la opción más óptima y al mismo tiempo más al estilo de Swift sería implementar el nivel de acceso directamente sobre la funcionalidad get y set de la propiedad, para luego definir un método que nos permita mutar su valor. Veamos:

internal private(set) var someValue: String?

En esta línea hemos modificado los controles de acceso, ahora tenemos internal como primer nivel de acceso haciendo referencia a la funcionalidad get, es decir que cualquiera dentro de todos los archivos de nuestro módulo podrá consultar el valor almacenado en la propiedad.

¿Cómo sabemos que en esta línea internal hace referencia a get y no a set?

Esto se aclara por si mismo ya que seguido de este tenemos otro nivel de acceso private(set) donde claramente se hace referencia a set de manera explícita, es decir, que en una sola línea hemos declarado los niveles de acceso necesarios, más sencillo imposible.

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

Ahorita necesitamos un método con nivel de acceso internal que nos permita filtrar el nuevo valor ya que no podemos confiar en que el usuario siempre lo pasará en mayúsculas que es como lo necesitamos, así que le daremos formato antes de almacenarlo. El método del que hablamos pudiera ser el siguiente:

func changeValue(newValue: String) {
        
   someValue = newValue.uppercased()
        
} // changeValue

Como ven este método no tiene nada de especial, de hecho ni siquiera hemos declarado la palabra clave internal, pero no es necesario ya que por defecto la clase, sus propiedades y métodos se encuentran en un nivel de acceso internal.

El código final sería:

//: Playground - noun: a place where people can play

import Cocoa

class SomeClass {
    
    internal private(set) var someValue: String?
    
    func changeValue(newValue: String) {
        
        someValue = newValue.uppercased()
        
    } // changeValue
    
    final func isEmpty() -> Bool {

        if someValue != nil {

            return false
            
        } // if

        return true
        
    } // isEmpty
    
} // SomeClass

let myClass = SomeClass()

print(myClass.isEmpty())

myClass.changeValue(newValue: "hola")

print(myClass.isEmpty())

print(myClass.someValue!)

la salida en pantalla:

true
false
HOLA

Como hemos visto el lenguaje de programación Swift, como otros lenguajes, nos brinda la opción de restringir el acceso a clases, funciones, variables, estructuras, enums, etc, aplicando así los niveles de control de accesos requeridos por nuestro diseño, de esta manera restringimos o permitimos la interacción entre los distintos bloques de código que conformen nuestro proyecto.

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