• ¿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 – Subscripts

Josué V. Herrera by Josué V. Herrera
in Swift
Reading Time: 8 mins read
A A
Subscripts, Swift
11
SHARES
36
VIEWS
Compartir en FacebookCompartir en Twitter

El día de hoy aprenderemos acerca de los subscripts o subíndices. Una característica del lenguaje Swift que venimos usando desde el inicio sin apenas prestarle atención, sin preguntarnos que habría tras esta funcionalidad.

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

Las clases, estructuras y enumeraciones pueden definir subscripts, los cuales no son más que una manera rápida o un enlace más directo a esos elementos (valores) que conforman una colección, lista o secuencia. Los subscripts nos permiten establecer u obtener valores haciendo uso de un índice sin necesidad de métodos para esta función.

Por ejemplo, para acceder a los elementos de un Array podemos hacer algo como:

someArray[index]

mientras en el caso de los diccionarios:

someDictionary[key]

Este modo de acceso a los datos es a lo que llamamos un subíndice o un subscript.

Subscripts Personalizados

Resumiendo y simplificando lo ante dicho: un subscript nos permiten hacer consultas a una instancias de cierto tipo al escribir uno o más valores dentro de corchetes ([]) luego del nombre de la instancia. Un comportamiento que también podemos aplicar en nuestros propios tipos mediante una implementación personalizada.

Sintaxis

La sintaxis de un subscript personalizado es similar a la de los métodos de instancia o a la de las propiedades computadas. La definición la comenzamos con la palabra clave subscript, acto seguido especificamos uno o más parámetros y finalizamos con un tipo de retorno tal y como hacemos con los métodos de instancia.

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

A diferencia de estos últimos los subscripts pueden ser de lectura y escritura o de solo lectura, un comportamiento que se logra a través de getters y setters de la misma forma que con las propiedades computadas:

subscript(index: Int) -> Int {

    get {

        // Aquí retornamos el valor apropiado

    } // get

    set(newValue) {

        // Aquí establecemos un valor

    } // set

} // subscript

Sobre newValue debemos decir que su tipo es el mismo que el del valor de retorno y, nuevamente, al igual que con las propiedades computadas podemos omitir en set la declaración del parámetro (newValue), caso en el que podremos seguir haciendo referencia a este nombre ya que Swift lo provee automáticamente.

Cuando deseamos lograr un comportamiento de solo lectura solamente tendremos que eliminar el bloque get:

subscript(index: Int) -> Int {

    // Aquí retornamos el valor apropiado

} // subscript

Implementación

Aquí el ejemplo de un subscript implementado como solo lectura dentro de una estructura:

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

import Cocoa

struct TimesTable {
    
    let multiplier: Int
    
    subscript(index: Int) -> Int {
        
        return multiplier * index
    
    } // subscript

} // TimesTable

let threeTimesTable = TimesTable(multiplier: 3)

print("Seis veces tres (6 * 3) es igual a: (threeTimesTable[6])")

la salida en pantalla sería:

Seis veces tres (6 * 3) es igual a: 18

De la línea 9 a la 13 definimos nuestro subscript y en la 17 creamos una instancia de la estructura y establecemos el multiplicador haciendo uso de inicializador por defecto de la estructura. En la siguiente línea efectuamos una llamada al subscript en pos de proceder a la multiplicación y obtener el valor de retorno.

¿Qué funcionalidades nos brinda un Subscript?

Hablemos ahora sobre las capacidades que nos ofrece un subscript, que podemos hacer con él, con cuanta flexibilidad contamos al definir un subscript personalizado. Podemos decir que:

  • Pueden tomar cualquier cantidad de parámetros de entrada los cuales pueden ser de cualquier tipo y dicho esto es «evidente» que también pueden retornar cualquier tipo de dato.
  • Pueden usar parámetros variádicos pero no pueden usar parámetros in-out o establecer valores por defecto.
  • Una clase o estructura puede proveer tantas implementaciones de subscripts como estas necesiten. El subscript a ser usado será inferido por los tipos de datos que sean pasados y en general por el uso que se haga de este, tal y como en una sobrecarga de métodos, de hecho la definición de varios subscripts se conoce como sobrecarga de subscripts.

Subscripts de múltiples parámetros

Lo más común es que un subscript tome solamente un parámetro pero como acabamos de comentar puede tomar múltiples. En el siguiente ejemplo definimos una estructura de nombre Matrix la cual representa una matriz de dos dimensiones de valores Double:

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

import Cocoa

struct Matrix {
    
    let rows: Int, columns: Int
    
    var grid: [Double]
    
    init(rows: Int, columns: Int) {
        
        self.rows = rows
        self.columns = columns

        grid = Array(repeating: 0.0, count: rows * columns)
    
    } // init
    
    func indexIsValid(row: Int, column: Int) -> Bool {
        
        return (row >= 0 && row < rows) && (column >= 0 && column < columns)
    
    } // indexIsValid
    
    subscript(row: Int, column: Int) -> Double {
        
        get {
            
            assert(indexIsValid(row: row, column: column), "Index out of range")
            
            return grid[(row * columns) + column]
            
        } // get
        
        set {
            
            assert(indexIsValid(row: row, column: column), "Index out of range")
            
            grid[(row * columns) + column] = newValue
            
        } // set
        
    } // subscript
    
} // Matrix

Comenzamos el código de la estructura definiendo las constantes rows (fila) y columns (columnas), acto seguido la cuadrícula de tipo Double que dará soporte a nuestra matriz. Aún cuando las estructuras nos brindan un inicializador por defecto hemos definido uno ya que necesitamos un proceso de inicialización un poco más personalizado.

Haciendo referencia a la línea 16 donde igualamos nuestra variable grid con un arreglo que inicializamos con el valor 0.0 el cual repartimos por todas las celdas de nuestra matriz multiplicando las filas por las columnas como también se puede observar en esta línea.

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

A nuestra estructura de ejemplo le hemos añadido un método de nombre indexIsValid que se encarga, tal y como su nombre indica, de verificar si cierto índice conformado por fila y columna es válido.

Por si alguien se lo pregunta los paréntesis añadidos a esta expresión no tienen la intención de lograr ningún comportamiento determinado, el único objetivo es la claridad a la hora de leer la línea.

Proseguimos con el subscript que declaramos de la línea 26 a la 44 el cual recibe dos parámetros de tipo Int, la fila y la columna, retornando un valor de tipo Double. Este subscript es de lectura-escritura y por eso tiene sus bloques get y set.

En ambos bloques comenzamos por verificar si las coordenadas son correctas, apoyándonos en indexIsValid al mismo tiempo que en la instrucción assert. Esta última en caso de recibir false como parámetro detendrá la ejecución de nuestro programa.

Creo importante aclarar que la función assert solamente es evaluada en modo Debug, si deseamos lograr lo mismo en modo Release y evitar que las llamadas a assert sean eliminadas por el compilador pues tendremos que hacer uso de la función precondition.

Para más información los invito a leer el artículo sobre el manejo de errores en el lenguaje de programación Swift.

La función assert solamente es evaluada en modo Debug, si deseamos lograr lo mismo en modo Release tenemos que usar la función precondition.

Luego de estas líneas en común, en el bloque get se devuelve el valor almacenado en las coordenadas especificadas y de manera similar en el bloque set almacenamos en la matriz el valor que el usuario pasa al subscript. En este punto solamente tendríamos que crear una instancia de la estructura, algo bien simple:

var matrix = Matrix(rows: 2, columns: 2)

hemos creado una tabla de dos filas y dos columnas y gracias a nuestro inicializador ahora sus celdas contienen el valor inicial que establecimos, tal y como se muestra en la siguiente imagen:

Swift - Subscripts - WeiseRatel

La siguiente acción sería sobre el subscript, el cual nos ayudaría a establecer algunos valores:

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

Acabamos de almacenar en la celda(0,1) el valor 1.5 y en la celda(1, 0) el valor 3.2, actualmente la matriz luce como:

Swift - Subscripts - WeiseRatel

Creo que ya ha quedado claro que son los subscript y las posibilidades que nos brindan. Evidentemente se pueden hacer muchas cosas más con estos, todo depende de nuestra necesidad.

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