Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Swift
Code

iOS Desde Cero Con Swift: Swift en Resumen

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called iOS From Scratch With Swift.
iOS From Scratch With Swift: Creating Your First iOS Application
iOS From Scratch With Swift: More Swift in a Nutshell

Spanish (Español) translation by Nadia Castelli (you can also view the original English article)

Apple presentó el lenguaje de programación Swift durante su conferencia de desarrolladores anual en 2014, para sorpresa de la comunidad de desarrolladores. La compañía es seria acerca de Swift, no es un experimento. El objetivo es que Swift sea el lenguaje de la próxima generación de aplicaciones para plataformas Apple.

Requisitos Previos

Programación

No es posible cubrir los aspectos básicos de la programación y aprender Swift en uno o dos artículos. Por lo tanto estoy asumiendo que ya tienes cierta experiencia en programación. Ruby, PHP o JavaScript son buenos puntos de partida para aprender Swift. Si tienes experiencia en desarrollo web, no deberías tener problemas en aprender los fundamentos de Swift después de leer los siguientes dos artículos.

Swift

En los próximos dos artículos, les mostraré el poder de los playgrounds, una característica introducida en Xcode 6. También cubriremos las bases del lenguaje de programación Swift, tales como variables, constantes y tipos de datos, incluyendo sets, arrays, y diccionarios.

También aprenderás los fundamentos de las clases y estructuras. En el siguiente artículo nos adentraremos en closures, funciones, protocolos y control de acceso. Esto te dará comprensión del lenguaje suficiente para completar el resto de esta serie.

Objective-C

Estrictamente hablando, C y Objective-C no son necesarios si estás interesado en desarrollar para la plataforma iOS. Dicho esto, la mayoría de los frameworks que utilizaremos para desarrollar aplicaciones iOS, están escritos en C y Objective-C. Esto significa que eventualmente hablaré sobre C y Objective-C. Sin embargo, no te preocupes, me aseguraré de que entiendas lo esencial para mantenerte en camino a alcanzar tu objetivo: convertirte en un desarrollador iOS.

Xcode y Swift

A lo largo de esta serie, usaré Xcode 7.1 y Swift 2.1. Si utilizas una versión anterior de Xcode, ten en cuenta que no estarás trabajando con Swift 2.1. Swift sigue cambiando a un ritmo rápido y la sintaxis evoluciona con cada iteración del lenguaje. Por este motivo, recomiendo usar Xcode 7.1, que incluye Swift 2.1.

1. Playgrounds

En 2014, Apple introdujo los playgrounds como parte de Xcode 6. Los playgrounds son geniales para aprender programación en Swift. Con playgrounds, puedes enfocarte en el código que estás escribiendo en vez de lidiar con carpetas, archivos y configuraciones del proyecto.

Vamos a crear un playground para empezar a aprender los fundamentos de Swift. Abre Xcode 7.1 y selecciona New > Playground... desde el menú File de Xcode. Los playgrounds soportan OS X, iOS y tvOS. Selecciona iOS en Platform, y nombra el playground como Swift in a Nutshell.

Create a Playground

Indica dónde deseas guardar el playground, y clickea Create. A primera vista, un playground parece ser un simple archivo con una extensión .playground, pero es realmente una carpeta con un puñado de archivos. Afortunadamente, no tenemos que preocuparnos por eso. Un playground es mucho más fácil de tratar que un proyecto de Xcode con docenas de archivos y carpetas.

Playground User Interface

La interfaz de usuario de un playground es limpia y sencilla. Podrás ver el editor de código a la izquierda y la salida a la derecha. Xcode ya ha poblado el playground con tres líneas de código. La primera línea debería serte familiar si leíste el tutorial anterior.

La línea comienza con dos barras, //, lo cual indica que esta línea es un comentario y es ignorada por el compilador. Los comentarios que abarcan varias líneas comienzan con /* y terminan con */.

Xcode también ha añadido un enunciado de importación para el framework de UIKit. UIKit es el framework más importante en el desarrollo iOS. Este framework define los bloques con que se construyen las aplicaciones iOS. En Swift, importar un framework es tan sencillo como usar la palabra clave import seguida del nombre del framework, UIKit.

La última línea quizás te recuerde a JavaScript. Utilizamos la palabra reservada var para declarar una variable, str, y asignarle un valor, "Hello, playground". Este ejemplo muestra inmediatamente una característica clave de Swift, inferencia de tipos.

El ejemplo anterior es un poco engañoso. Podrías pensar que Swift es un lenguaje débilmente tipado, pero nada más lejano a la verdad. La variable str es de tipo String. Swift es lo suficientemente inteligente como para deducir el tipo de str con tan sólo mirar el valor que asignamos a la variable.

El siguiente ejemplo es equivalente. En este ejemplo, especificamos explícitamente el tipo de la variable str. Los dos puntos después del nombre de la variable se podrían leer como "es del tipo".

2. Variables y Constantes

Swift también define la palabra reservada let. Esta palabra reservada se utiliza para declarar una constante. El lenguaje de programación Swift fomenta el uso de constantes siempre que sea posible. Si el valor de una variable no cambia durante toda su vida, debe ser una constante. Como su nombre indica, una vez que a una constante se le da un valor, no se puede cambiar. Esto se ilustra en el ejemplo siguiente.

The value of a constant cannot be changed

En el ejemplo anterior, declaramos una constante message y le asignamos un valor. Unas líneas abajo, le asignamos un nuevo valor a la constante de message. Como intentamos cambiar el valor de message, el compilador produce un error. Afortunadamente, el compilador hace una sugerencia para solucionar el problema, convirtiendo la constante message en una variable.

3. Tipos de Datos

Swift define una amplia gama de tipos de datos, pero echemos un vistazo a algunos de los tipos de datos más comunes que  encontrarás.

Booleanos

Empecemos con un tipo simple, Bool. Los valores booleanos en Swift son tan simples y fáciles de usar como lo son en otros lenguajes. El siguiente ejemplo es probablemente lo más simple que Swift permite.

Números

Los números son representados por Int, UInt, Float o Double. Hay otros tipos de datos para almacenar valores numéricos, pero estos son los más comunes. Estos tipos de datos son similares a las que se encuentran en otros lenguajes de programación.

Como Swift es un lenguaje fuertemente tipado, necesitarás lidiar con conversiones de tipo de vez en cuando. Por ejemplo, no es posible multiplicar un Int y un Float. Echa un vistazo al siguiente ejemplo para comprender mejor el problema.

Type Conversion

En principio, esto pareciera ser un defecto importante del lenguaje Swift. La verdad es que este comportamiento es inherente a los lenguajes más fuertemente tipados. Afortunadamente, la solución es simple, como puedes ver aquí debajo.

Converting a Number

Aunque pareciera que estamos convirtiendo a a un Float, eso no es lo que está pasando. Estamos creando o inicializando un Float utilizando el valor almacenado en a.

Existen dos maneras de crear una variable o constante, sintaxis literal y sintaxis de inicializador. Las constantes a y b fueron creadas usando sintaxis literal. La variable str que mencionamos antes es otro ejemplo de sintaxis literal.

Para crear un Float a partir del valor almacenado en a, utilizamos sintaxis de inicializador, Creamos el Float usando el nombre del tipo, Float, seguido de dos paréntesis, pasándole a como parámetro.

Strings

Ya hemos visto algunos strings en este tutorial. Un string no es más que una secuencia de caracteres. De hecho, es posible acceder la colección de caracteres como se muestra en el siguiente ejemplo.

En el ejemplo de arriba, utilizamos un string literal. El siguiente ejemplo ilustra cómo utilizar el inicializador de tipo String. La sintaxis es idéntica a lo que vimos en uno de los ejemplos anteriores acerca de los números y la conversión de tipos.

Colecciones

La librería estándar de Swift define tres tipos de colección comunes, Array, Dictionary, y Set. Estos tipos de colección requieren poca explicación si estás familiarizado con Objective-C u otro lenguaje de programación. En algunos lenguajes, los diccionarios son conocidos como hashes, y los arrays son conocidos como listas. La idea, sin embargo, es la misma.

El array y el diccionario están inicializados usando sintaxis literal. Como el tipo Set no tiene sintaxis literal, utilizamos la sintaxis de inicializador para crear la constante mySet.

Ya he mencionado que Swift es un lenguaje fuertemente tipado y esto a su vez acarrea consecuencias para los tipos de colección. El siguiente ejemplo lo ilustra. Comenzamos creando una variable arr1 de tipo [Int]. Esto significa que arr1 sólo puede contener valores de tipo Int.

Collection Types

Las sentencias segunda y tercera lo confirman. Agregar un entero al final funciona bien, pero agregar un string al final resulta en un error de compilación. El compilador intenta convertir "Two" en un Int, pero no puede. Esto resulta en un error.

El siguiente ejemplo hará las cosas aún más confusas. ¿Por qué el compilador no se queja acerca del array que contiene valores de diferentes tipos? La razón quizás te sorprenda. La constante arr2 es de tipo [AnyObject].

Any y AnyObject

La librería estándar de Swift define dos tipos especiales, Any y AnyObject. El tipo Any puede representar cualquier tipo, mientras que AnyObject puede representar cualquier clase o estructura. Si esto te confunde, es perfectamente normal. Swift fue diseñado para ser fuertemente tipado y pareciera que Any y AnyObject atentan contra la seguridad de tipos de Swift.

El motivo para introducir Any y AnyObject en Swift, es principalmente por razones de compatibilidad. Ya he mencionado que la mayoría de los frameworks usados en el desarrollo Cocoa están escritos en C y Objective-C. Objective-C define el tipo id, que representa cualquier objeto. Para tener la seguridad de que Swift y los Cocoa frameworks pueden funcionar juntos, la librería estándar de Swift introdujo los tipos Any y AnyObject. Aprenderemos más acerca de esto cuando empecemos a trabajar con los Cocoa frameworks.

4. Clases y Estructuras

Clases

Si estás familiarizado con la programación orientada a objetos, entonces las clases deberían serte familiares. Las clases son bastante ordinarias en Swift. Echa un vistazo al siguiente ejemplo, donde definimos una clase, Boat, con dos propiedades, speed y lifeboats, y un método, deployLifeboats().

Inicializar y modificar una instancia de la clase Boat es tan directo como puedes ver debajo. Llamar a un método de una instancia tampoco es arte de magia. Lo básico de las clases de Swift es sencillo de comprender. No?

Estructuras

Ahora creemos una estructura que se vea sorprendentemente similar a la clase Boat y descubramos qué diferencia a las clases de las estructuras en Swift.

El siguiente ejemplo revela la diferencia más importante entre las clases y las estructuras de Swift.

Difference Between Classes and Structures in Swift

Este ejemplo ilustra que las clases se pasan por referencia, mientras que las estructuras se pasan por valor. ¿Qué significa esto? Inicializamos una instancia de Boat, la asignamos a boat1, y establecemos su propiedad speed en 11.0. Asignamos boat1 a boat2. Esto significa que boat2 tiene una referencia a boat1. Tanto boat1 como boat2 apuntan a la misma instancia de Boat. El resultado es que modificar la propiedad speed de boat2 también modifica la propiedad speed de boat1.

Esto no se cumple para las estructuras. Repetimos los mismo pasos usando la estructura Ship. El resultado final es diferente, sin embargo. Al asignar ship1 a ship2, el valor de ship1 se copia y se almacena en ship2. Esto significa que ship1 y ship2 apuntan a objetos diferentes, distintas instancias de la estructura Ship. Entender este concepto es de suma importancia, así que debes asegurarte de comprenderlo antes de continuar.

Consecuencias

Ya has visto los tipos de datos comunes definidos en la librería estándar de Swift. Lo que no mencioné en esa discusión es que cada tipo de dato de Swift que hemos visto hasta el momento es una estructura.

Cada tipo de colección en Swift, por ejemplo, es una estructura. Cada tipo de número es una estructura. Es importante que sepas y entiendas esto, especialmente si provienes de un lenguaje que pasa algunos de estos tipos por referencia, como Ruby u Objective-C.

Más Diferencias

Existen otras diferencias que separan a las clases de las estructuras en Swift. Las clases soportan herencia, mientras que las estructuras no. En el siguiente ejemplo, definimos una clase Speedboat que hereda de la clase Boat. La clase Boat es la clase madre o superclase de Speedboat.

Debido a que Boat es la clase madre de Speedboat, Speedboat hereda las propiedades y métodos definidos en la clase Boat. Este ejemplo lo ilustra. Aunque la implementación de la clase Speedboat está vacía, la instancia de Speedboat, myBoat, tiene las propiedades speed y lifeboats así como también un método deployLifeboats().

Una diferencia más sutil que divide a las clases de las estructuras es el chequeo de tipos en tiempo de ejecución. Puedes chequear el tipo de una instancia de clase en tiempo de ejecución, mientras que esto no es posible para instancias de estructura.

5. Optionals

Los optionals son una parte integral del lenguaje de programación Swift. Descubramos qué son los optionals y por qué son tan importantes. Una variable debe ser inicializada antes de ser usada. Echa un vistazo al siguiente ejemplo para entender qué significa esto.

Si estás acostumbrado a trabajar con strings en otros lenguajes de programación, quizás te sorprenda que el compilador produzca un error. Veamos qué error nos muestra.

Variable Not Initialized

En muchos lenguajes de programación, las variables tiene un valor inicial por defecto. En Objective-C, por ejemplo, el string en el siguiente trozo de código es igual a nil.

Qué Es un Optional?

Swift utiliza optionals para encapsular un concepto importante, una variable o constante o bien tiene un valor, o bien no lo tiene. Es así de sencillo en Swift. Para declarar una variable o constante como opcional, le agregamos un signo de interrogación al final del tipo de la variable o constante.

La variable str ya no es de tipo String. Ahora es del tipo opcional String. Es importante comprender esto. La consecuencia es que ya no podemos interactuar directamente con el valor de str. El valor está almacenado a salvo en el optional, y necesitamos preguntarle al optional el valor que encapsula.

Forced Unwrapping

Una manera de acceder al valor de un optional es mediante force unwrapping. Podemos acceder al valor de str agregando un ! al final del nombre de la variable.

Es importante que te asegures que el optional contiene un valor cuando le aplicas force unwrap. Si aplicas force unwrap en un optional que no tiene valor, Swift producirá un error y tu aplicación se cerrará.

Forced Unwrapping an Optional Without a Value

Optional Binding

Existe una manera más segura de acceder al valor de un optional. El siguiente ejemplo muestra cómo podemos acceder de forma segura al valor almacenado en str, que es de tipo String?.

Primero, corroboramos que str sea igual a nil antes de imprimir su contenido. En este ejemplo, str no contiene un valor. Esto significa que no se le podrá aplicar force unwrap por accidente.

Hay una manera mucho más elegante conocida como optional binding. En el siguiente ejemplo, le asignamos el valor almacenado en el optional a una constante temporal. El valor del optional str está ligado a la constante strConst y disponible en la cláusula if de la sentencia if. Este enfoque sirve también para sentencias while.

Qué Es nil?

Si provienes de un lenguaje como Objective-C, entonces sabes qué es nil. En Objective-C, nil es un puntero a un objeto que no existe. Swift define a nil de manera un poco diferente, y es importante que comprendas la diferencia.

En Swift, nil representa la ausencia de valor, cualquier valor. Mientras que nil sólo es aplicable a objetos en Objective-C, en Swift nil puede ser usado en cualquier tipo.

¿Extrañas el Punto y Coma?

¿Has notado que no hemos utilizado ningún punto y coma en los ejemplos de este tutorial? En Swift, no hay necesidad de usar punto y coma, porque el compilador es lo suficientemente inteligente para reconocer cuándo termina una sentencia y cuándo comienza otra. Si realmente extrañas el uso del punto y coma, puedes agregarlos. De todas formas, recuerda que en la guía del lenguaje se recomienda omitir los punto y coma.

Conclusión

Aunque sólo hemos arañado la superficie en este tutorial, ahora tienes un conocimiento básico del lenguaje de programación Swift. En el próximo tutorial, exploraremos otro componente clave del lenguaje, closures y funciones. Además, discutiremos protocolos y control de acceso.

Si tienes preguntas o comentarios, puedes dejarlos en la sección de comentarios aquí debajo, o contactarme vía Twitter.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.