Si ha leído las lecciones anteriores de esta serie, ya debería tener un buen conocimiento de los fundamentos del lenguaje de programación Swift. Hablamos sobre variables, constantes y funciones, y en la lección anterior cubrimos los conceptos básicos de la programación orientada a objetos en Swift.
Si bien los patios de recreo son una excelente herramienta para jugar con Swift y aprender el idioma, es hora de seguir adelante y crear nuestro primer proyecto Swift en Xcode. En esta lección, vamos a crear los cimientos de una aplicación de tarea sencilla utilizando Xcode y Swift. A lo largo del camino, aprenderemos más sobre la programación orientada a objetos y también analizaremos más de cerca la integración de Swift y Objective-C..
Si desea seguirme conmigo, asegúrese de tener Xcode 8.3.2 o superior instalado en su máquina. Xcode 8.3.2 está disponible en la tienda de aplicaciones de Apple.
Inicia Xcode 8.3.2 o superior y selecciona Nuevo> Proyecto ... desde el Expediente menú. Desde el iOS sección, elige la Solicitud de vista única plantilla y haga clic Siguiente.
Nombra el proyecto Que hacer y establecer Idioma a Rápido. Asegurarse Dispositivos se establece en iPhone y las casillas de verificación en la parte inferior están desactivadas. Hacer clic Siguiente continuar.
Dile a Xcode dónde te gustaría almacenar tu proyecto y haz clic Crear en la parte inferior derecha para crear tu primer proyecto Swift.
Antes de continuar nuestro viaje hacia Swift, tomemos un momento para ver lo que Xcode ha creado para nosotros. Si eres nuevo en Xcode y en el desarrollo de iOS, la mayor parte de esto será nuevo para ti. Al trabajar con un proyecto Swift, sin embargo, obtendrá una mejor idea de cómo son las clases y las estructuras y cómo se comportan en Swift..
La plantilla de proyecto no difiere mucho de un proyecto creado con Objective-C como lenguaje de programación. Las diferencias más importantes están relacionadas con la AppDelegate
y ViewController
clases.
Si ha trabajado con Objective-C en el pasado, notará que la plantilla de proyecto contiene menos archivos. No hay encabezado (.h) o implementación (.metro) Archivos que se encuentran en nuestro proyecto. En Swift, las clases no tienen un archivo de encabezado separado en el que se declara la interfaz. En su lugar, una clase se declara y se implementa en un solo .rápido expediente.
Nuestro proyecto contiene actualmente dos archivos Swift, uno para el AppDelegate
clase, AppDelegate.swift, y otro para el ViewController
clase, ViewController.swift. El proyecto también incluye dos storyboards., Main.storyboard y LaunchScreen.storyboard. Trabajaremos con el guión gráfico un poco más adelante en esta lección. Actualmente solo contiene la escena para el ViewController
clase.
Hay algunos otros archivos y carpetas incluidos en el proyecto, pero vamos a ignorarlos por ahora. No juegan ningún papel importante en el alcance de esta lección..
Lo primero que abordaremos en esta lección es la herencia, un paradigma común en la programación orientada a objetos. En Swift, solo las clases pueden heredar de otra clase. En otras palabras, las estructuras y las enumeraciones no admiten la herencia. Esta es una de las diferencias clave entre clases y estructuras..
Abierto ViewController.swift Para ver la herencia en acción. La interfaz y la implementación del ViewController
La clase es bastante básica, lo que nos facilita centrarnos en lo esencial..
En la cima de ViewController.swift, debería ver una declaración de importación para el marco UIKit. Recuerde que el marco UIKit proporciona la infraestructura para crear una aplicación funcional de iOS. La declaración de importación en la parte superior hace que esta infraestructura esté disponible para nosotros en ViewController.swift.
importar UIKit
Debajo de la declaración de importación, definimos una nueva clase llamada ViewController. Los dos puntos después del nombre de la clase no se traducen a es de tipo Como vimos anteriormente en esta serie. En cambio, la clase después de los dos puntos es la superclase de ViewController
clase. En otras palabras, el siguiente fragmento podría leerse como Definimos una clase llamada ViewController
que hereda de UIViewController
.
clase ViewController: UIViewController
Esto también explica la presencia de la declaración de importación en la parte superior de ViewController.swift desde el UIViewController
La clase se define en el framework UIKit..
los ViewController
la clase actualmente incluye dos métodos, pero observe que cada método tiene el prefijo anular
palabra clave. Esto indica que los métodos están definidos en la superclase de la clase (o más arriba en el árbol de herencia) y son reemplazados por la ViewController
clase.
clase ViewController: UIViewController invalide func viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()
los anular
la construcción no existe en Objective-C. En Objective-C, implementas un método anulado en una subclase sin indicar explícitamente que anula un método más arriba en el árbol de herencia. El tiempo de ejecución de Objective-C se encarga del resto..
Mientras que lo mismo es cierto en Swift, el anular
las palabras clave añaden seguridad al método de anulación. Porque hemos prefijado el viewDidLoad ()
método con el anular
palabra clave, Swift espera este método en la superclase de la clase o superior del árbol de herencia. En pocas palabras, si reemplaza un método que no existe en el árbol de herencia, el compilador generará un error. Puedes probar esto escribiendo mal viewDidLoad ()
método como se muestra a continuación.
Agreguemos una vista de tabla al controlador de vista para mostrar una lista de elementos de tareas pendientes. Antes de hacerlo, debemos crear una salida para la vista de tabla. Una salida no es más que una propiedad que se puede ver y se puede configurar en Interface Builder. Para declarar una salida en el ViewController
clase, prefijamos la propiedad, una variable, con la @IBOutlet
atributo.
clase ViewController: UIViewController @IBOutlet var tableView: UITableView! anular func viewDidLoad () super.viewDidLoad () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()
Tenga en cuenta que la salida es un opcional implícitamente desenvuelto. ¿Un qué? Permítanme comenzar diciendo que una salida siempre debe ser un tipo opcional. La razón es simple. Cada propiedad de la ViewController
La clase debe tener un valor después de la inicialización. Sin embargo, una salida solo está conectada a la interfaz de usuario en el tiempo de ejecución después de la ViewController
instancia ha sido inicializada de ahí el tipo opcional.
Espera un minuto. los tableView
outlet se declara como un opcional implícitamente sin envolver, no como un opcional. No hay problema. Podemos declarar el tableView
toma como opcional, reemplazando el signo de exclamación en el fragmento anterior con un signo de interrogación. Eso compilaría muy bien. Sin embargo, esto también significaría que deberíamos desenvolver explícitamente la propiedad cada vez que deseamos acceder al valor almacenado en el opcional. Esto se volvería rápidamente engorroso y detallado..
En su lugar, declaramos el tableView
outlet como un opcional implícitamente sin envolver, lo que significa que no necesitamos desenvolver explícitamente el opcional si necesitamos acceder a su valor. En resumen, un opcional implícitamente sin envolver es un opcional, pero podemos acceder al valor almacenado en el opcional como una variable regular. Lo importante a tener en cuenta es que su aplicación se bloqueará si intenta acceder a su valor si no se ha establecido ningún valor. Ese es el gotcha. Sin embargo, si la toma está conectada correctamente, podemos estar seguros de que la toma está configurada cuando intentamos acceder a ella por primera vez.
Con la salida declarada, es el momento de conectarlo en Interface Builder. Abierto Main.storyboard, y seleccione el controlador de vista. Escoger Insertar en> Controlador de navegación desde el Editor menú. Esto establece el controlador de vista como el controlador de vista raíz de un controlador de navegación. No te preocupes por esto por ahora.
Arrastrar un UITableView
instancia de la Biblioteca de objetos a la vista del controlador de vista y agregue las restricciones de diseño necesarias. Con la vista de tabla seleccionada, abra el Inspector de conexiones y establecer la vista de tabla fuente de datos
y delegar
salidas al controlador de vista.
Con el Inspector de conexiones aún abierto, seleccione el controlador de vista y conecte tableView
Salida a la vista de tabla que acabamos de añadir. Esto conecta el tableView
salida de la ViewController
clase a la vista de tabla.
Antes de poder construir y ejecutar la aplicación, necesitamos implementar el UITableViewDataSource
y UITableViewDelegate
protocolos en el ViewController
clase. Esto involucra varias cosas.
Necesitamos decirle al compilador que el ViewController
clase se ajusta a la UITableViewDataSource
y UITableViewDelegate
protocolos La sintaxis es similar a la de Objective-C.
clase ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate …
Los protocolos que cumple la clase se enumeran después de la superclase, UIViewController
en el ejemplo anterior. Si una clase no tiene una superclase, lo cual no es infrecuente en Swift, los protocolos se enumeran inmediatamente después del nombre de la clase y los dos puntos..
UITableViewDataSource
ProtocoloPorque el UITableViewDelegate
El protocolo no define los métodos requeridos, solo vamos a implementar el UITableViewDataSource
Protocolo por ahora. Antes de hacerlo, vamos a crear una propiedad variable para almacenar los elementos de tareas que vamos a enumerar en la vista de tabla.
clase ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate @IBOutlet var tableView: UITableView! elementos var: [String] = []…
Declaramos una propiedad variable. artículos
de tipo [Cuerda]
y establecer una matriz vacía, []
, como el valor inicial. Esto debería parecer familiar a estas alturas. A continuación, implementemos los dos métodos requeridos del UITableViewDataSource
protocolo.
El primer método requerido, numberOfRows (inSection :)
, es fácil. Simplemente devolvemos el número de artículos almacenados en el artículos
propiedad.
func tableView (_ tableView: UITableView, sección numberOfRowsInSection: Int) -> Int return items.count
El segundo método requerido., cellForRow (en :)
, necesita una explicacion Usando la sintaxis del subíndice, preguntamos artículos
para el elemento que corresponde con la fila actual.
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Fetch Item let item = items [indexPath.row] // Dequeue Cell let cell = tableView.dequeueReusableCell (withIdentifier: "TableViewCell", para: indexPath ) // Configurar celda cell.textLabel? .Text = item return cell
Luego le pedimos a la vista de tabla una celda con identificador "TableViewCell"
, pasando la ruta del índice para la fila actual. Tenga en cuenta que almacenamos la celda en una constante, célula
. No hay necesidad de declarar. célula
como una variable.
En la siguiente línea de código, configuramos la celda de vista de tabla, configurando el texto de la etiqueta de texto con el valor de ít
. Tenga en cuenta que en Swift el etiqueta de texto
propiedad de UITableViewCell
se declara como un tipo opcional de ahí el signo de interrogación. Esta línea de código podría leerse como establecer la etiqueta de texto texto
propiedad a ít
Si etiqueta de texto
no es igual a nulo
. En otras palabras, la etiqueta de texto texto
la propiedad solo se establece si etiqueta de texto
no es nulo
. Este es un constructo de seguridad muy conveniente en Swift conocido como encadenamiento opcional.
Hay dos cosas que debemos resolver antes de compilar la aplicación. Primero, debemos decirle a la vista de tabla que necesita usar el UITableViewCell
clase para crear nuevas celdas de vista de tabla. Hacemos esto invocando registerClass (_: forCellReuseIdentifier :)
, pasando en el UITableViewCell
clase y el identificador de reutilización que utilizamos anteriormente, "TableViewCell"
. Actualizar el viewDidLoad ()
método como se muestra a continuación.
anular func viewDidLoad () super.viewDidLoad () // Registrar clase para la reutilización de células tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")
Actualmente no tenemos ningún elemento para mostrar en la vista de tabla. Esto se resuelve fácilmente poblando el artículos
propiedad con algunos elementos de tareas pendientes. Hay varias maneras de lograr esto. He elegido poblar el artículos
propiedad en el viewDidLoad ()
método como se muestra a continuación.
anular func viewDidLoad () super.viewDidLoad () // Popular Items items = ["Buy Milk", "Finish Tutorial", "Play Minecraft"] // Register Class para Cell Reuse tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")
Es hora de tomar nuestra aplicación para dar una vuelta. Seleccionar correr de Xcode's Producto menú o golpe Comando-R. Si has seguido, deberías terminar con el siguiente resultado.
Tenga en cuenta que he añadido un título, Que hacer, en la parte superior de la vista en la barra de navegación. Puedes hacer lo mismo configurando título
propiedad de la ViewController
instancia en el viewDidLoad ()
método.
anular func viewDidLoad () super.viewDidLoad () // Establecer título title = "To Do" // Rellenar elementos de elementos = ["Buy Milk", "Finish Tutorial", "Play Minecraft"] // Register Class for Cell Reuse tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")
Aunque acabamos de crear una aplicación simple, has aprendido muchas cosas nuevas. Hemos explorado la herencia y los métodos primordiales. También cubrimos los protocolos y cómo adoptar los UITableViewDataSource
protocolo en el ViewController
clase. Sin embargo, lo más importante que has aprendido es cómo interactuar con las API de Objective-C.
Es importante comprender que las API del SDK de iOS están escritas en Objective-C. Swift fue diseñado para ser compatible con estas API. Basado en fallas anteriores, Apple comprendió que Swift necesitaba poder conectarse al iOS SDK sin tener que volver a escribir cada API en Swift..
Combinar Objective-C y Swift es posible, pero hay algunas advertencias que exploraremos con más detalle a medida que avancemos. Debido al implacable enfoque de Swift en la seguridad, debemos tomar algunos obstáculos de vez en cuando. Sin embargo, ninguno de estos obstáculos es tan grande como lo descubriremos en la próxima lección en la que continuamos trabajando en nuestra aplicación de tareas pendientes..
Mientras tanto, echa un vistazo a algunos de nuestros otros cursos y tutoriales sobre el desarrollo de Swift en iOS.!