384
1 Acerca de Swift NOTA Para obtener la documentación preliminar de una futura actualización de la lengua Swift, ver El Swift Lenguaje de Programación . Swift es un nuevo lenguaje de programación para iOS y OS X aplicaciones que se basa en la mejor de C y Objective-C, sin las limitaciones de compatibilidad C. Swift adopta patrones de programación seguras y añade características modernas para hacer la programación más fácil, más flexible y más divertido. Borrón y cuenta nueva de Swift, respaldadas por los maduros y los marcos de cacao y cacao Touch muy querida, es una oportunidad para re-imaginar cómo funciona el desarrollo de software. Swift ha estado años en la fabricación. Manzana sentó las bases de Swift por el avance de nuestro compilador, depurador, y la infraestructura marco existente. Hemos simplificado la gestión de memoria con el recuento de referencias automático (ARC). Nuestra pila marco, construido sobre la base sólida de la Fundación y el Cacao, se ha modernizado y estandarizada en todo. Objective-C en sí ha evolucionado para soportar bloques, literales colección, y los módulos, lo que permite la adopción marco de las tecnologías lingüísticas modernas sin interrupciones. Gracias a este trabajo preliminar, ahora podemos introducir un nuevo lenguaje para el futuro del desarrollo de software de Apple. Swift se siente familiar para los desarrolladores de Objective-C. Adopta la legibilidad de los parámetros con nombre de Objective-C y el poder del modelo de objeto dinámico de Objective-C. Proporciona un acceso transparente a los marcos existentes de cacao y mezclar y combinar la interoperabilidad con código de Objective-C. La construcción de esta base común, Swift introduce muchas nuevas características y unifica las partes procesales y orientados a objetos del lenguaje. Swift es amigable para los nuevos programadores. Es el primer lenguaje de programación de sistemas de calidad industrial que es tan expresiva y agradable como un lenguaje de script. Es compatible con juegos infantiles, una característica innovadora que permite a los programadores para experimentar con el código Swift y ver los resultados inmediatamente, sin la sobrecarga de la creación y ejecución de una aplicación. Swift combina lo mejor del pensamiento lengua moderna con la sabiduría de la cultura de ingeniería de Apple en general. El compilador está optimizado para el rendimiento, y el idioma se ha optimizado para el desarrollo, sin comprometer a ambos. Está diseñado para escalar de "hola, mundo" a todo un sistema operativo. Todo esto hace que Swift una inversión de futuro sólido para los desarrolladores y para Apple. Swift es una fantástica manera de escribir iOS y OS X aplicaciones, y seguirá evolucionando con nuevas características y capacidades. Nuestras metas para Swift son ambiciosos. No podemos esperar a ver lo que creas con él. A Swift tour

Acerca de Swift En español.pdf

Embed Size (px)

Citation preview

  • 1

    Acerca de Swift N O T A Para obtener la documentacin preliminar de una futura actualizacin de la lengua Swift, ver El Swift Lenguaje de Programacin .

    Swift es un nuevo lenguaje de programacin para iOS y OS X aplicaciones que se basa en la mejor de C y Objective-C, sin las limitaciones de compatibilidad C. Swift adopta patrones de programacin seguras y aade caractersticas modernas para hacer la programacin ms fcil, ms flexible y ms divertido. Borrn y cuenta nueva de Swift, respaldadas por los maduros y los marcos de cacao y cacao Touch muy querida, es una oportunidad para re-imaginar cmo funciona el desarrollo de software. Swift ha estado aos en la fabricacin. Manzana sent las bases de Swift por el avance de nuestro compilador, depurador, y la infraestructura marco existente. Hemos simplificado la gestin de memoria con el recuento de referencias automtico (ARC). Nuestra pila marco, construido sobre la base slida de la Fundacin y el Cacao, se ha modernizado y estandarizada en todo. Objective-C en s ha evolucionado para soportar bloques, literales coleccin, y los mdulos, lo que permite la adopcin marco de las tecnologas lingsticas modernas sin interrupciones. Gracias a este trabajo preliminar, ahora podemos introducir un nuevo lenguaje para el futuro del desarrollo de software de Apple. Swift se siente familiar para los desarrolladores de Objective-C. Adopta la legibilidad de los parmetros con nombre de Objective-C y el poder del modelo de objeto dinmico de Objective-C. Proporciona un acceso transparente a los marcos existentes de cacao y mezclar y combinar la interoperabilidad con cdigo de Objective-C. La construccin de esta base comn, Swift introduce muchas nuevas caractersticas y unifica las partes procesales y orientados a objetos del lenguaje. Swift es amigable para los nuevos programadores. Es el primer lenguaje de programacin de sistemas de calidad industrial que es tan expresiva y agradable como un lenguaje de script. Es compatible con juegos infantiles, una caracterstica innovadora que permite a los programadores para experimentar con el cdigo Swift y ver los resultados inmediatamente, sin la sobrecarga de la creacin y ejecucin de una aplicacin. Swift combina lo mejor del pensamiento lengua moderna con la sabidura de la cultura de ingeniera de Apple en general. El compilador est optimizado para el rendimiento, y el idioma se ha optimizado para el desarrollo, sin comprometer a ambos. Est diseado para escalar de "hola, mundo" a todo un sistema operativo. Todo esto hace que Swift una inversin de futuro slido para los desarrolladores y para Apple. Swift es una fantstica manera de escribir iOS y OS X aplicaciones, y seguir evolucionando con nuevas caractersticas y capacidades. Nuestras metas para Swift son ambiciosos. No podemos esperar a ver lo que creas con l.

    A Swift tour

  • 2

    La tradicin sugiere que el primer programa en un nuevo idioma debe imprimir las palabras "Hola, mundo!" En la pantalla. En Swift, esto se puede hacer en una sola lnea:

    println ( "Hola, mundo!" ) Si ha escrito cdigo en C o Objective-C, esta sintaxis se parece familiar a usted-en Swift, esta lnea de cdigo es un programa completo. No es necesario importar una biblioteca independiente para la funcionalidad como de entrada / salida o manejo de cadenas. El cdigo escrito en el mbito mundial se utiliza como punto de entrada para el programa, por lo que no es necesario un principal funcin. Tambin no es necesario escribir un punto y coma al final de cada sentencia. Este tour le da suficiente informacin para empezar a escribir cdigo en Swift mostrando cmo lograr una variedad de tareas de programacin. No se preocupe si usted no entiende algo, todo lo presentado en este tour se explica en detalle en el resto de este libro. N O T A Para una mejor experiencia, abra este captulo como un parque infantil en Xcode. Parques infantiles permiten editar los listados de cdigo y ver el resultado inmediatamente. Descargar juegos Los valores simples Utilice dejar de hacer una constante y var para hacer una variable. El valor de una constante no necesita ser conocido en tiempo de compilacin, pero usted debe asignarle un valor exactamente una vez. Esto significa que puede usar constantes para nombrar un valor que se determina una vez, pero utiliza en muchos lugares.

    var myVariable = 42 myVariable = 50 let myConstant = 42

    Una constante o variable deben tener el mismo tipo que el valor que se desea asignar a la misma. Sin embargo, no siempre se tiene que escribir el tipo explcitamente. Proporcionar un valor cuando se crea una constante o variable permite al compilador deducir su tipo. En el ejemplo anterior, el compilador infiere quemyVariable es un nmero entero debido a que su valor inicial es un nmero entero. Si el valor inicial no proporciona suficiente informacin (o si no hay valor inicial), especificar el tipo de escritura que despus de la variable, separados por dos puntos.

    let implicitInteger = 70 let implicitDouble = 70.0 let explicitDouble: Double = 70

    EXPERIMENTO Crear una constante con un tipo explcito de flotador y un valor de 4 . Los valores no se convierten implcitamente a otro tipo. Si usted necesita para convertir un valor a un tipo diferente, hacer explcita una instancia del tipo deseado.

    let label = "The width is " let width = 94

  • 3

    let widthLabel = label + String(width) EXPERIMENTO Trate de no incluir la conversin a la Cadena de la ltima lnea. Qu error Qu se obtiene? Hay una manera an ms fcil de incluir valores en cadenas: Escriba el valor entre parntesis, y escribir una barra invertida ( \ ) antes del parntesis. Por ejemplo:

    let apples = 3 let oranges = 5 let appleSummary = "I have \(apples) apples." let fruitSummary = "I have \(apples + oranges) pieces of fruit."

    EXPERIMENTO Use \ () para incluir un clculo de punto flotante en una cadena y que incluya el nombre de alguien en un saludo. Crear matrices y diccionarios utilizando corchetes ( [] ), y acceder a sus elementos por escribir el ndice o la clave entre corchetes.

    var shoppingList = ["catfish", "water", "tulips", "blue paint"] shoppingList[1] = "bottle of water" var occupations = [ "Malcolm": "Captain", "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public Relations"

    Para crear una matriz vaca o diccionario, utilice la sintaxis de inicializador. let emptyArray = [String]() let emptyDictionary = [String: Float]()

    Si la informacin de tipo se puede inferir, puede escribir una matriz vaca como [] y un diccionario vaco como[:] ; por ejemplo, cuando se establece un nuevo valor para una variable o pasar un argumento a una funcin.

    shoppingList = [] occupations = [:]

    Control de flujo Utilice si y cambiar para hacer los condicionales, y utilizar para - en , para , mientras , y hacer - mientras quepara hacer bucles. Los parntesis alrededor de la variable de condicin o bucle son opcionales. Se requieren los apoyos de todo el cuerpo.

    let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores { if score > 50 {

  • 4

    teamScore += 3 } else { teamScore += 1 } } teamScore

    N O T A En el cdigo anterior, teamScore se escribe en una lnea por s mismo. Esta es una manera simple de ver el valor de una variable dentro de un parque infantil. En un caso de declaracin, la condicin debe ser una expresin-este Booleano significa que el cdigo comosi la puntuacin {...} es un error, no una comparacin implcita a cero. Usted puede utilizar si y dejar juntos para trabajar con valores que pudieran faltar. Estos valores se representan como opcionales. Un valor opcional o bien contiene un valor o contiene cero para indicar que el valor no est presente. Escriba un signo de interrogacin ( ? ) despus de que el tipo de un valor para marcar el valor como opcional.

    var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" }

    EXPERIMENTO Cambie optionalName a nil . Lo saludo Qu se obtiene? Aadir una cosa clusula que establece un saludo diferente si optionalName es nula . Si el valor opcional es nula , el condicional es falsa y el cdigo entre llaves se omite. De lo contrario, el valor opcional se desenvuelve y se asigna a la constante despus de let , lo que hace que el valor envolver disponible dentro del bloque de cdigo. Switches soportan cualquier tipo de datos y una amplia variedad de operaciones de comparacin-que no se limitan a nmeros enteros y las pruebas para la igualdad.

    let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich."

  • 5

    case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy \(x)?" default: let vegetableComment = "Everything tastes good in soup." }

    EXPERIMENTO Trate de no incluir el caso por defecto. Qu error Qu se obtiene? Ntese cmo dejar que se puede utilizar en un patrn para asignar el valor que coincide con esa parte de un patrn a una constante. Despus de ejecutar el cdigo dentro de la caja del interruptor que haca juego, el programa sale de la sentencia switch. Ejecucin no contina al siguiente caso, lo que no hay necesidad de romper explcitamente del interruptor al final del cdigo de cada caso. Se utiliza para - en iterar sobre los elementos de un diccionario, proporcionando un par de nombres a utilizar para cada par clave-valor. Los diccionarios son una coleccin desordenada, por lo que sus claves y valores se repiten a lo largo en un orden arbitrario.

    let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } } } largest

    EXPERIMENTO Aadir otra variable para realizar un seguimiento de qu tipo de nmero es el ms grande, as como lo que mayor nmero era. Utilice mientras que repetir un bloque de cdigo hasta que una condicin cambia. El estado de un bucle puede estar en el extremo en su lugar, asegurando que el bucle se ejecuta al menos una vez.

  • 6

    var n = 2 while n < 100 { n = n * 2 } n var m = 2 do { m = m * 2 } while m < 100 m

    Usted puede mantener un ndice en un bucle, ya sea mediante el uso de .. < para hacer una serie de ndices o escribiendo un explcito inicializacin, condicin, y el incremento. Estos dos lazos hacen lo mismo:

    var firstForLoop = 0 for i in 0.. para separar los nombres de los parmetros y tipos de tipo de retorno de la funcin.

    func greet(name: String, day: String) -> String { return "Hello \(name), today is \(day)." } greet("Bob", "Tuesday")

    EXPERIMENTO Retire el da parmetro. Agregar un parmetro para incluir el almuerzo especial de hoy en el saludo.

  • 7

    Utilice una tupla para hacer un ejemplo de valor para el compuesto, para devolver varios valores de una funcin. Los elementos de una tupla se pueden denominar por su nombre o por nmero.

    func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) { var min = scores[0] var max = scores[0] var sum = 0 for score in scores { if score > max { max = score } else if score < min { min = score } sum += score } return (min, max, sum) } let statistics = calculateStatistics([5, 3, 100, 3, 9]) statistics.sum statistics.2

    Las funciones tambin pueden tomar un nmero variable de argumentos, a su recogida en una matriz.

    func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum } sumOf() sumOf(42, 597, 12)

    EXPERIMENTO Escriba una funcin que calcula el promedio de sus argumentos. Las funciones pueden ser anidados. Funciones anidadas tienen acceso a las variables que fueron declaradas en la funcin externa. Puede utilizar las funciones anidadas para organizar el cdigo en una funcin que es largo o complejo.

  • 8

    func returnFifteen() -> Int { var y = 10 func add() { y += 5 } add() return y } returnFifteen()

    Las funciones son un tipo de primera clase. Esto significa que una funcin puede devolver otra funcin como su valor.

    func makeIncrementer() -> (Int -> Int) { func addOne(number: Int) -> Int { return 1 + number } return addOne } var increment = makeIncrementer() increment(7)

    Una funcin puede tener otra funcin como uno de sus argumentos. func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool { for item in list { if condition(item) { return true } } return false } func lessThanTen(number: Int) -> Bool { return number < 10 } var numbers = [20, 19, 7, 12] hasAnyMatches(numbers, lessThanTen)

    Las funciones son en realidad un caso especial de cierres: bloques de cdigo que se pueden llamar ms tarde. El cdigo en un cierre tiene acceso a cosas como las variables y funciones que estaban disponibles en el mbito donde se cre el cierre, incluso si el cierre es en un mbito diferente cuando se ejecuta-que viste un ejemplo de esto ya con

  • 9

    funciones anidadas. Usted puede escribir un cierre sin nombre rodeando cdigo con llaves ( {} ). Utilice en separar los argumentos y el tipo de retorno del cuerpo.

    numbers.map({ (number: Int) -> Int in let result = 3 * number return result })

    EXPERIMENTO Vuelva a escribir el cierre para volver a cero para todos los nmeros impares. Usted tiene varias opciones para la escritura de los cierres de forma ms concisa. Cuando el tipo de un cierre que ya se conoce, por ejemplo, la devolucin de llamada de un delegado, se puede omitir el tipo de sus parmetros, el tipo de retorno, o ambos. Cierres sola instruccin implcitamente devuelven el valor de su nica declaracin.

    let mappedNumbers = numbers.map({ number in 3 * number }) mappedNumbers

    Se puede hacer referencia a los parmetros de nmero en vez de por su nombre-este enfoque es especialmente til en los cierres muy cortos. Un cierre pasado como el ltimo argumento de la funcin puede aparecer inmediatamente despus del parntesis.

    let sortedNumbers = sorted(numbers) { $0 > $1 } sortedNumbers

    Objetos y clases Utilice la clase seguido del nombre de la clase para crear una clase. Una declaracin de propiedad en una clase se escribe de la misma manera como una declaracin de constante o variable, excepto que es en el contexto de una clase. De igual forma, mtodo y funcin declaraciones se escriben de la misma manera.

    class Shape { var numberOfSides = 0 func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." } }

    EXPERIMENTO Aadir una propiedad constante con let , y aadir otro mtodo que toma un argumento. Crear una instancia de una clase, poniendo entre parntesis despus del nombre de la clase. Utilice la sintaxis con punto para acceder a las propiedades y mtodos de la instancia.

    var shape = Shape() shape.numberOfSides = 7

  • 10

    var shapeDescription = shape.simpleDescription() Esta versin de la Forma clase le falta algo importante: un inicializador para configurar la clase cuando se crea una instancia. Utilice init para crear una.

    class NamedShape { var numberOfSides: Int = 0 var name: String init(name: String) { self.name = name } func simpleDescription() -> String { return "A shape with \(numberOfSides) sides." } }

    Observe cmo auto se utiliza para distinguir el nombre de la propiedad del nombre de argumento para el inicializador. Los argumentos para el inicializador se pasan como una llamada a la funcin cuando se crea una instancia de la clase. Cada propiedad necesita un valor asignado, ya sea en su declaracin (como connumberOfSides ) o en el inicializador (como con el nombre ). Utilice deinit para crear un deinitializer si es necesario realizar alguna tarea de limpieza antes de que se cancela la asignacin del objeto. Las subclases incluyen su nombre despus de su superclase nombre de la clase, separados por dos puntos.No hay ningn requisito para las clases subclase cualquier clase raz estndar, por lo que puede incluir u omitir una superclase, segn sea necesario. Los mtodos en una subclase que anulan la implementacin de la superclase estn marcados con el override-overriding un mtodo por el accidente, sin anulacin , es detectado por el compilador como un error. El compilador tambin detecta con mtodos de anulacin que en realidad no anulan cualquier mtodo en la superclase.

    class Square: NamedShape { var sideLength: Double init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 4 } func area() -> Double {

  • 11

    return sideLength * sideLength } override func simpleDescription() -> String { return "A square with sides of length \(sideLength)." } } let test = Square(sideLength: 5.2, name: "my test square") test.area() test.simpleDescription()

    EXPERIMENTO Haga otra subclase de NamedShape llamado Crculo que tiene un radio y un nombre como argumentos a su inicializador. Implementar un rea y un simpleDescription mtodo en el Crculo de clase. Adems de las propiedades simples que se almacenan, las propiedades pueden tener un getter y un setter.

    class EquilateralTriangle: NamedShape { var sideLength: Double = 0.0 init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 3 } var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } override func simpleDescription() -> String { return "An equilateral triangle with sides of length \(sideLength)." }

  • 12

    } var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle") triangle.perimeter triangle.perimeter = 9.9 triangle.sideLength

    En la incubadora de permetro , el nuevo valor tiene el nombre implcito nuevoValor . Puede proporcionar un nombre explcito entre parntesis despus de conjunto . Observe que el inicializador para la EquilateralTriangle clase tiene tres etapas diferentes: 1. Establecer el valor de las propiedades que la subclase declara. 2. Llamando inicializador de la superclase. 3. Cambiar el valor de las propiedades definidas por la superclase. Cualquier trabajo de

    configuracin adicional que utiliza mtodos getters o setters tambin se puede hacer en este momento.

    Si no es necesario para calcular la propiedad, pero todava tiene que proporcionar el cdigo que se ejecuta antes y despus de fijar un nuevo valor, utilice willSet y didSet . Por ejemplo, la clase a continuacin se asegura de que la longitud del lado de su tringulo es siempre la misma que la longitud del lado de su cuadrado.

    class TriangleAndSquare { var triangle: EquilateralTriangle { willSet { square.sideLength = newValue.sideLength } } var square: Square { willSet { triangle.sideLength = newValue.sideLength } } init(size: Double, name: String) { square = Square(sideLength: size, name: name) triangle = EquilateralTriangle(sideLength: size, name: name) } } var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape") triangleAndSquare.square.sideLength triangleAndSquare.triangle.sideLength

  • 13

    triangleAndSquare.square = Square(sideLength: 50, name: "larger square") triangleAndSquare.triangle.sideLength

    Los mtodos de las clases tienen una diferencia importante de funciones. Los nombres de parmetros en funciones slo se utilizan dentro de la funcin, pero los parmetros nombres en los mtodos tambin se utilizan cuando se llama al mtodo (excepto para el primer parmetro). Por defecto, un mtodo tiene el mismo nombre para sus parmetros cuando se llama a ella y dentro del mtodo en s. Se puede especificar un segundo nombre, que se utiliza dentro del mtodo.

    class Counter { var count: Int = 0 func incrementBy(amount: Int, numberOfTimes times: Int) { count += amount * times } } var counter = Counter() counter.incrementBy(2, numberOfTimes: 7)

    Cuando se trabaja con valores opcionales, puede escribir ? antes de las operaciones, como los mtodos, propiedades y subndices. Si el valor antes de la ? es nula , todo despus de la ? se ignora y el valor de toda la expresin es nula . De lo contrario, el valor es opcional sin envolver, y todo despus de la ? acta sobre el valor de envolver. En ambos casos, el valor de toda la expresin es un valor opcional.

    let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") let sideLength = optionalSquare?.sideLength

    Las enumeraciones y estructuras Utilice enum para crear una enumeracin. Al igual que las clases y todos los dems tipos con nombre, enumeraciones pueden tener mtodos asociados con ellos.

    enum Rank: Int { case Ace = 1 case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten case Jack, Queen, King func simpleDescription() -> String { switch self { case .Ace: return "ace" case .Jack: return "jack" case .Queen: return "queen" case .King:

  • 14

    return "king" default: return String(self.toRaw()) } } } let ace = Rank.Ace let aceRawValue = ace.toRaw()

    EXPERIMENTO Escriba una funcin que compara dos Rank valores mediante la comparacin de sus valores brutos. En el ejemplo anterior, el tipo de valor bruto de la enumeracin es int , por lo que slo tiene que especificar el primer valor crudo. El resto de los valores brutos se asignan en orden. Tambin puede utilizar cadenas o nmeros de punto flotante como el tipo de prima de una enumeracin. Utilice los toRaw y fromRaw funciones para convertir entre el valor bruto y el valor de la enumeracin.

    if let convertedRank = Rank.fromRaw(3) { let threeDescription = convertedRank.simpleDescription() }

    Los valores de los miembros de una enumeracin son valores reales, no slo otra manera de escribir sus valores brutos. De hecho, en los casos donde no hay un valor en bruto significativo, usted no tiene que proporcionar una.

    enum Suit { case Spades, Hearts, Diamonds, Clubs func simpleDescription() -> String { switch self { case .Spades: return "spades" case .Hearts: return "hearts" case .Diamonds: return "diamonds" case .Clubs: return "clubs" } } } let hearts = Suit.Hearts

  • 15

    let heartsDescription = hearts.simpleDescription() EXPERIMENTO Agregar un color de mtodo para Suit que devuelve "negro" para espadas y palos, y los retornos "rojos" de corazones y diamantes. Observe las dos formas en que el Hearts miembro de la enumeracin se hace referencia ms arriba: Al asignar un valor a los corazones constantes, los miembros de enumeracin Suit.Hearts se refiere por su nombre completo porque la constante no tiene un tipo explcito especificado. En el interior del interruptor, la enumeracin es referido por la forma abreviada .Hearts porque el valor del auto que ya se sabe que es un juego. Usted puede utilizar el formulario abreviado en cualquier momento el tipo del valor que ya se conoce. Utilice struct para crear una estructura. Estructuras de soporte para muchas de las mismas conductas como las clases, incluyendo mtodos y inicializadores. Una de las diferencias ms importantes entre las estructuras y las clases es que las estructuras siempre se copian cuando se pasan alrededor en su cdigo, pero las clases se pasan por referencia.

    struct Card { var rank: Rank var suit: Suit func simpleDescription() -> String { return "The \(rank.simpleDescription()) of \(suit.simpleDescription())" } } let threeOfSpades = Card(rank: .Three, suit: .Spades) let threeOfSpadesDescription = threeOfSpades.simpleDescription()

    EXPERIMENTO Agregue un mtodo para la tarjeta que crea una baraja completa de tarjetas, con una carta de cada combinacin de rango y palo. Una instancia de un miembro de la enumeracin puede tener valores asociados con la instancia. Las instancias de la misma miembro de enumeracin pueden tener diferentes valores asociados con ellos. Usted proporciona los valores asociados al crear la instancia. Valores asociados y valores primas son diferentes: El valor bruto de un miembro de la enumeracin es el mismo para todas sus instancias, y le proporcionar el valor en bruto cuando se define la enumeracin. Por ejemplo, considere el caso de solicitar el amanecer y el atardecer hora de un servidor. El servidor o bien responde con la informacin o responde con un poco de informacin de error.

    enum ServerResponse { case Result(String, String) case Error(String) }

  • 16

    let success = ServerResponse.Result("6:00 am", "8:09 pm") let failure = ServerResponse.Error("Out of cheese.") switch success { case let .Result(sunrise, sunset): let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)." case let .Error(error): let serverResponse = "Failure... \(error)" }

    EXPERIMENTO Aadir un tercer caso a ServerResponse y para el interruptor. Observe cmo se extraen las horas de salida y puesta del sol desde el ServerResponse valor como parte de hacer coincidir el valor contra los casos de conmutacin. Protocolos y Extensiones Utilice el protocolo para declarar un protocolo.

    protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust()

    } Las clases, enumeraciones y estructuras de todo pueden adoptar protocolos.

    class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." } } var a = SimpleClass() a.adjust() let aDescription = a.simpleDescription struct SimpleStructure: ExampleProtocol { var simpleDescription: String = "A simple structure" mutating func adjust() { simpleDescription += " (adjusted)" } }

  • 17

    var b = SimpleStructure() b.adjust() let bDescription = b.simpleDescription

    EXPERIMENTO Escribe una enumeracin que se ajusta a este protocolo. Note el uso de la mutacin de la palabra clave en la declaracin de SimpleStructure para marcar un mtodo que modifica la estructura. La declaracin de SimpleClass no necesita ninguno de sus mtodos marcados como mutando debido a los mtodos de una clase siempre puede modificar la clase. Utilice la extensin para agregar funcionalidad a un tipo existente, tales como nuevos mtodos y propiedades calculadas. Puede utilizar una extensin para aadir conformidad protocolo a un tipo que se declara en otro lugar, o incluso a un tipo que ha importado de una biblioteca o un marco.

    extension Int: ExampleProtocol { var simpleDescription: String { return "The number \(self)" } mutating func adjust() { self += 42 } } 7.simpleDescription

    EXPERIMENTO Escribe una extensin para el doble tipo, que aade un absoluteValue propiedad. Puede utilizar un nombre de protocolo al igual que cualquier otro ejemplo de tipo de llamada, para crear una coleccin de objetos que tienen diferentes tipos, sino que todos cumplir con un protocolo nico. Cuando se trabaja con valores cuyo tipo es un tipo de protocolo, los mtodos fuera de la definicin de protocolo no estn disponibles.

    let protocolValue: ExampleProtocol = a protocolValue.simpleDescription // protocolValue.anotherProperty // Uncomment to see the error

    A pesar de que la variable protocolValue tiene un tipo de tiempo de ejecucin de SimpleClass , el compilador lo trata como el tipo dado de ExampleProtocol . Esto significa que no se puede acceder accidentalmente a los mtodos o propiedades que la clase implementa adems de su conformidad protocolo. Genricos Escriba un nombre dentro de parntesis angulares para hacer una funcin genrica o tipo.

    func repeat(item: ItemType, times: Int) -> [ItemType] { var result = [ItemType]() for i in 0..

  • 18

    result.append(item) } return result } repeat("knock", 4)

    Usted puede hacer las formas genricas de las funciones y mtodos, as como las clases, enumeraciones y estructuras.

    // Reimplementar tipo opcional de la biblioteca estndar de Swift

    enum OptionalValue { case None case Some(T) } var possibleInteger: OptionalValue = .None possibleInteger = .Some(100)

    Use where after the type name to specify a list of requirementsfor example, to require the type to implement a protocol, to require two types to be the same, or to require a class to have a particular superclass.

    func anyCommonElements (lhs: T, rhs: U) -> Bool {

    for lhsItem in lhs { for rhsItem in rhs { if lhsItem == rhsItem { return true } } } return false } anyCommonElements([1, 2, 3], [3]) anyCommonElements ([ 1 , 2 , 3 ], [ 3 ])

    EXPERIMENTO Modifique el anyCommonElements funcin para realizar una funcin que devuelve una matriz de los elementos que las dos secuencias tienen en comn. En los casos sencillos, se puede omitir cuando y simplemente escriba el nombre del protocolo o de clase despus de dos puntos. Escribiendo es lo mismo que escribir .

  • 19

    Los Fundamentos En esta pgina Swift es un nuevo lenguaje de programacin para iOS y OS X de desarrollo de aplicaciones. No obstante, muchas partes de Swift estarn familiarizados desde su experiencia en el desarrollo en C y Objective-C. Swift proporciona sus propias versiones de todos los tipos C y Objective-C fundamentales, incluido Int para enteros, doble y flotador para los valores de punto flotante, Bool para valores booleanos y de cadena para los datos textuales. Swift tambin ofrece versiones potentes de los dos tipos de recoleccin primaria, matriz yDiccionario , como se describe en Tipos Collection . Al igual que C, Swift utiliza variables para almacenar y hacer referencia a los valores por un nombre de identificacin. Swift tambin hace un amplio uso de variables cuyos valores no se pueden cambiar. Estos son conocidos como constantes, y son mucho ms poderosos que las constantes en C. Las constantes se utilizan a lo largo Swift para hacer el cdigo ms seguro y ms clara en su intencin cuando se trabaja con valores que no tienen que cambiar. Adems de los tipos conocidos, Swift presenta tipos avanzadas que no se encuentran en Objective-C, como tuplas. Tuples le permiten crear y pasar alrededor de agrupaciones de valores. Puede usar una tupla para devolver varios valores de una funcin como un valor nico compuesto. Swift tambin introduce tipos opcionales, que se encargan de la ausencia de un valor. Opcionales dicen bien "no es un valor, y que es igual a x "o" no , no es un valor en absoluto ". Opcionales son similares al uso de nilcon punteros en Objective-C, pero trabajan para cualquier tipo, no slo a las clases. Opcionales son ms seguros y ms expresiva que nil punteros en Objective-C y estn en el centro de muchas de las caractersticas ms poderosas de Swift. Opcionales son un ejemplo del hecho de que Swift es un seguro de tipo de idioma. Swift le ayuda a ser claro acerca de los tipos de valores de su cdigo puede trabajar. Si parte de su cdigo espera una cuerda , la seguridad de tipos le impide pasndole un Int por error. Esta restriccin le permite capturar y corregir los errores lo antes posible en el proceso de desarrollo. Constantes y Variables Constantes y variables asociar un nombre (como maximumNumberOfLoginAttempts o WelcomeMessage ) con un valor de un tipo concreto (por ejemplo, el nmero 10 o la cadena "Hola" ). El valor de una constante no se puede cambiar una vez que se establece, mientras que una variable de puede ajustarse a un valor diferente en el futuro. Declaracin de constantes y variables Constantes y variables deben ser declaradas antes de ser utilizadas. Usted declara constantes con la let de palabras clave y las variables con la var palabra clave. He aqu un ejemplo de cmo las constantes y las variables se pueden utilizar para realizar el seguimiento del nmero de intentos de inicio de sesin de un usuario ha hecho:

    let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0

    Este cdigo se puede leer como:

  • 20

    "Declarar una nueva constante llamada maximumNumberOfLoginAttempts , y darle un valor de 10 . A continuacin, declarar una nueva variable llamada currentLoginAttempt , y darle un valor inicial de 0 ". En este ejemplo, el nmero mximo de intentos de inicio de sesin permitidos se declara como una constante, debido a que el valor mximo nunca cambia. El contador de inicio de sesin actual intento se declara como una variable, ya que este valor debe ser incrementado despus de cada intento fallido de inicio de sesin. Se pueden declarar varias constantes o variables mltiples en una misma lnea, separados por comas:

    var x = 0,0 , y = 0,0 , z = 0,0 N O T A Si un valor almacenado en el cdigo no va a cambiar, siempre declararemos como una constante con la letpalabra clave. Utilice variables slo para almacenar valores que deben ser capaces de cambiar. Tipo Anotaciones Puede proporcionar una anotacin de tipo cuando se declara una constante o variable, para tener claro el tipo de valores de la tienda lata constante o variable. Escribe una anotacin de tipo mediante la colocacin de dos puntos despus del nombre de la constante o variable, seguido por un espacio, seguido por el nombre del tipo de usar. Este ejemplo proporciona una anotacin de tipo para una variable llamada WelcomeMessage , para indicar que la variable puede almacenar de Cuerda valores:

    var welcomeMessage: String Los dos puntos en la declaracin significa "... el tipo ...", por lo que el cdigo anterior se puede leer como: "Declarar una variable llamada WelcomeMessage que es del tipo String. " La frase "de tipo String "significa" puede almacenar cualquier Cadena de valor. "Piense en ello como que significa" el tipo de cosas "(o" el tipo de cosa ") que se puede almacenar. El WelcomeMessage variables ahora se puede ajustar a cualquier valor de cadena sin error:

    WelcomeMessage = "Hola" Puede definir mltiples variables relacionadas del mismo tipo en una sola lnea, separados por comas, con un solo tipo de anotacin despus de que el nombre de la variable definitiva:

    var red, green, blue: Double N O T A Es raro que usted necesita para escribir anotaciones de tipo en la prctica. Si proporciona un valor inicial para una constante o variable en el punto que se define, Swift casi siempre se puede inferir el tipo que se utilizar para que constante o variable, como se describe en el tipo de seguridad y la inferencia de tipos . En la WelcomeMessage ejemplo anterior, no se proporciona ningn valor inicial, por lo que el tipo de laWelcomeMessage variable se especifica con una anotacin de tipo en lugar de ser inferido a partir de un valor inicial.

  • 21

    Nombrar constantes y variables Los nombres de constantes y variables pueden contener casi cualquier carcter, incluidos los caracteres Unicode:

    let = 3.14159 let = ""

    let = "dogcow" Los nombres de constantes y variables no pueden contener espacios en blanco, smbolos matemticos, flechas, de uso privado (o no vlidos) los puntos de cdigo Unicode o caracteres de lnea y caja de dibujo.Tampoco pueden comenzar con un nmero, aunque las cifras pueden ser incluidos en otro lugar dentro del nombre. Una vez que se ha declarado una constante o variable de un cierto tipo, no se puede redeclare de nuevo con el mismo nombre, o cambiarlo para almacenar valores de un tipo diferente. Tampoco se puede cambiar una constante en una variable o una variable en una constante. N O T A Si usted necesita dar una constante o variable el mismo nombre que una palabra clave reservada Swift, rodear la palabra clave con la espalda garrapatas ( ` ) cuando se utiliza como un nombre. Sin embargo, evite el uso de palabras clave como nombres a menos que tenga absolutamente ninguna opcin. Puede cambiar el valor de una variable existente a otro valor de un tipo compatible. En este ejemplo, el valor de friendlyWelcome se cambia de "Hola!" a "Bonjour!" :

    var friendlyWelcome = "Hello!" friendlyWelcome = "Bonjour!" // friendlyWelcome is now "Bonjour!"

    A diferencia de una variable, el valor de una constante no se puede cambiar una vez que se establece. Si lo intenta, se reporta como un error cuando se compila el cdigo:

    let languageName = "Swift" languageName = "Swift++"

    // Se trata de un error de tiempo de compilacin - languageName no se puede cambiar Constantes de impresin y variables Usted puede imprimir el valor actual de una constante o variable con el println funcin:

    println(friendlyWelcome) // prints "Bonjour!" println es una funcin global que imprime un valor, seguido por un salto de lnea, a una salida apropiada. En Xcode, por ejemplo, println imprime su salida en el panel de "consola" de Xcode. (Una segunda funcin, la impresin , realiza la misma tarea sin anexar un salto de lnea al final del valor que se va a imprimir.) El println funcin imprime cualquier Cadena de valor se pasa a la misma:

    println("This is a string")

  • 22

    // prints "This is a string" El println funcin puede imprimir mensajes de registro ms complejos, de una manera similar a la de CocoaNSLog funcin. Estos mensajes pueden incluir los valores actuales de constantes y variables. Swift utiliza interpolacin de cadenas para incluir el nombre de una constante o variable como un marcador de posicin en una cadena ms larga, ya una pronta Swift sustituirlo por el valor actual de esa constante o variable. Envuelva el nombre entre parntesis y escapar con una barra invertida antes del parntesis de apertura:

    println("The current value of friendlyWelcome is \(friendlyWelcome)") // Impresiones "El valor actual de friendlyWelcome es Bonjour!" N O T A Todas las opciones que puede utilizar con la interpolacin de cadenas se describen en la Cadena de interpolacin . Comentarios Utilice los comentarios para incluir texto no ejecutable en su cdigo, como una nota o un recordatorio a s mismo. Los comentarios son ignorados por el compilador Swift cuando se compila el cdigo. Comentarios en Swift son muy similares a los comentarios en C. sola lnea Los comentarios comienzan con dos barras inclinadas (forward- // ):

    // Esto es un comentario Los comentarios multilnea empiezan con una barra inclinada seguida de un asterisco ( / * ) y terminan con un asterisco seguido de una barra diagonal ( * / ):

    / * Este es tambin un comentario, pero escrito en varias lneas * /

    A diferencia de los comentarios de varias lneas en C, los comentarios de varias lneas en Swift se pueden anidar dentro de otros comentarios multilnea. Usted escribe comentarios anidados por iniciar un bloque de varias lneas de comentarios y luego iniciar un segundo comentario de varias lneas en el primer bloque. El segundo bloque se cierra a continuacin, seguido por el primer bloque:

    / * Este es el comienzo de la primera comentario multilnea / * Esta es la segunda, comentario de varias lneas anidada * /

    este es el final de la primera comentario multilnea * / Comentarios multilnea anidadas permiten a comentar a cabo grandes bloques de cdigo de forma rpida y sencilla, incluso si el cdigo contiene ya los comentarios de varias lneas. Punto y coma A diferencia de muchos otros idiomas, Swift no requiere que usted escriba un punto y coma ( ; ) despus de cada sentencia en el cdigo, aunque puede hacerlo si lo desea. Los puntos y comas se requiere, sin embargo, si desea escribir varias instrucciones separadas en una sola lnea:

    let cat = ""; println(cat)

  • 23

    // prints "" Enteros Los enteros son nmeros enteros sin componente fraccional, como 42 y -23 . Los nmeros enteros se seafirmado (positivo, cero o negativo) o sin signo (positivo o cero). Swift proporciona firmado y enteros sin signo de 8, 16, 32 y 64 forma de bits. Estos enteros siguen una convencin de nomenclatura similar a C, en que un entero sin signo de 8 bits es de tipo Uint8 , y un entero con signo de 32 bits es de tipo Int32 . Al igual que todos los tipos de Swift, estos tipos enteros tienen nombres propios. Entero lmites Usted puede acceder a los valores mnimo y mximo de cada tipo entero con su min y max propiedades:

    let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8 let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8

    Los valores de estas propiedades son del tipo de nmero de tamao apropiado (tales como Uint8 en el ejemplo anterior) y por lo tanto se pueden utilizar en expresiones junto con otros valores del mismo tipo. Int En la mayora de los casos, usted no tiene que elegir un tamao especfico de nmero entero para utilizar en su cdigo. Swift proporciona un tipo entero adicional, Int , que tiene el mismo tamao que el tamao de palabra nativa de la plataforma actual: En una plataforma de 32 bits, Int es del mismo tamao que Int32 . En una plataforma de 64 bits, Int es del mismo tamao que Int64 . A menos que usted necesita para trabajar con un tamao especfico de nmero entero, utilice siempre Intpara valores enteros en el cdigo. Esto ayuda cdigo de coherencia y la interoperabilidad. Incluso en las plataformas de 32 bits, Int puede almacenar cualquier valor entre -2147483648 y 2147483647 , y es lo suficientemente grande para muchos rangos enteros. UInt Swift tambin proporciona un tipo entero sin signo, UInt , que tiene el mismo tamao que el tamao de palabra nativa de la plataforma actual: En una plataforma de 32 bits, UInt es del mismo tamao que UInt32 . En una plataforma de 64 bits, UInt es del mismo tamao que UInt64 . N O T A Uso UInt slo cuando se necesita especficamente un tipo entero sin signo con el mismo tamao que el tamao de palabra nativa de la plataforma. Si este no es el caso, Int se prefiere, incluso cuando los valores a ser almacenados son conocidos por ser no negativo. Un uso consistente de Int para el cdigo de ayudas valores enteros interoperabilidad, evita la necesidad de convertir entre diferentes tipos de nmeros, y coincide con el tipo entero de inferencia, como se describe en el tipo de seguridad y tipo de inferencia . Nmeros de punto flotante Nmeros de coma flotante son nmeros con un componente fraccional, como 3.14159 , 0.1 , y -273.15 . Tipos de punto flotante pueden representar una gama mucho ms amplia de valores que los tipos enteros, y pueden almacenar nmeros que son mucho ms grandes o ms

  • 24

    pequeos que se pueden almacenar en unint . Swift proporciona dos tipos de nmeros de punto flotante firmados: Doble representa un nmero de punto flotante de 64 bits. selo cuando los valores

    de punto flotante deben ser muy grandes o particularmente precisa. Float representa un nmero de punto flotante de 32 bits. selo cuando los valores

    de punto flotante no requieren precisin de 64 bits. N O T A Doble tiene una precisin de al menos 15 dgitos decimales, mientras que la precisin de flotador puede ser tan poco como 6 dgitos decimales. El tipo de punto flotante apropiado utilizar depende de la naturaleza y el rango de valores que necesita para trabajar en su cdigo. Escriba Seguridad y tipo de inferencia Swift es un seguro de tipo de idioma. Un lenguaje de tipo seguro anima a ser claro acerca de los tipos de valores de su cdigo puede trabajar. Si parte de su cdigo espera una cuerda , no se puede pasar un int por error. Debido Swift es un tipo seguro, realiza escribir cheques al compilar el cdigo y banderas cualesquiera tipos no coincidentes como errores. Esto le permite capturar y corregir los errores lo antes posible en el proceso de desarrollo. Tipo de comprobacin le ayuda a evitar errores cuando se trabaja con diferentes tipos de valores. Sin embargo, esto no significa que usted tiene que especificar el tipo de cada constante y variable que se declara. Si no se especifica el tipo de valor que necesita, Swift utiliza la inferencia de tipos para calcular el tipo apropiado. La inferencia de tipos permite un compilador para deducir el tipo de una expresin concreta de forma automtica cuando se compila el cdigo, simplemente mediante el examen de los valores suministrados por el usuario. Debido a la inferencia de tipos, Swift requiere muchos menos declaraciones de tipo que lenguajes como C o Objective-C. Constantes y variables todava se escriben de forma explcita, pero gran parte del trabajo de especificar su tipo est hecho para usted. La inferencia de tipos es particularmente til cuando se declara una constante o variable con un valor inicial.Esto se suele hacer mediante la asignacin de un valor literal (o literal ) a la constante o variable en el punto que se declara. (Un valor literal es un valor que aparece directamente en el cdigo fuente, como 42 y 3,14159en los ejemplos a continuacin.) Por ejemplo, si se asigna un valor literal de 42 a una nueva constante sin decir de qu tipo es, Swift infiere que desea que la constante de ser un int , porque usted ha inicializado con un nmero que se ve como un entero:

    let meaningOfLife = 42 // MeaningOfLife se infiere a ser de tipo Int

    Del mismo modo, si no se especifica un tipo de un literal de coma flotante, Swift infiere que desea crear undoble :

    let pi = 3.14159 // Pi se infiere a ser de tipo doble

    Swift siempre elige doble (en lugar de Float ) cuando inferir el tipo de nmeros en coma flotante.

  • 25

    Si combina enteros y de punto flotante literales en una expresin, un tipo de doble ser inferirse del contexto:

    let anotherPi = 3 + 0.14159 // AnotherPi tambin se infiere a ser de tipo doble

    El valor literal de 3 tiene ningn tipo explcito en y de s mismo, y por lo tanto un tipo de salida apropiado deDoble se infiere de la presencia de un literal de coma flotante como parte de la adicin. Los literales numricos Literales enteros se pueden escribir como: Un decimal nmero, sin el prefijo Un binario nmero, con un 0b prefijo Un octal nmero, con un 0o prefijo A hexadecimal nmero, con un 0x prefijo Todos estos literales enteros tienen un valor decimal de 17 :

    let decimalInteger = 17 let binaryInteger = 0b10001 // 17 in binary notation let octalInteger = 0o21 // 17 in octal notation let hexadecimalInteger = 0x11 // 17 in hexadecimal notation

    Literales de punto flotante pueden ser decimal (sin prefijo) o hexadecimal (con un 0x prefijo). Ellos siempre deben tener un nmero (o nmero hexadecimal) en ambos lados de la coma decimal. Tambin pueden tener un opcional exponente , indicada por una mayscula o minscula e para carrozas decimales, o una mayscula o minscula p para carrozas hexadecimales. Para los nmeros decimales con un exponente de exp , el nmero base se multiplica por 10 exp : 1.25e2 significa 1.25 10 2 , o 125,0 . 1.25E-2 significa 1,25 10 -2 , o 0,0125 . Para los nmeros hexadecimales con un exponente de exp , el nmero base se multiplica por 2 exp : 0xFp2 significa 15 2 2 , o 60.0 . 0xFp-2 significa 15 2 -2 , o 3,75 . Todos estos literales de punto flotante tienen un valor decimal de 12.1875 :

    let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0

    Los literales numricos pueden contener un formato extra para que sean ms fciles de leer. Ambos nmeros enteros y flotadores pueden ser rellenados con ceros adicionales y pueden contener guiones bajos para ayudar con la lectura. Ningn tipo de formato afecta el valor subyacente de la literal:

    let paddedDouble = 000123.456

  • 26

    let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1

    Tipo de conversin numrica Utilice la Int tipo para todas las constantes de enteros de propsito general y variables en su cdigo, aunque son conocidos por ser no negativo. Utilizando el tipo de entero por defecto en situaciones cotidianas significa que constantes enteras y variables son inmediatamente interoperable en el cdigo y se corresponda con el tipo inferido para valores enteros literales. Utilice otros tipos enteros slo cuando son especficamente necesarios para la tarea en cuestin, debido a los datos de forma explcita tamao de una fuente externa, o para el funcionamiento, uso de memoria, u otro optimizacin necesaria. El uso de tipos explcita tamao en estas situaciones ayuda a detectar cualquier desbordamientos de valor accidentales y documenta implcitamente la naturaleza de los datos que se utiliza. Entero Conversin El rango de nmeros que pueden ser almacenadas en una constante entera o variable es diferente para cada tipo numrico. Un INT8 constante o variable pueden almacenar nmeros entre -128 y 127 , mientras que unUint8 constante o variable pueden almacenar nmeros entre 0 y 255 . Un nmero que no caben en una constante o variable de un tipo entero de tamao se indica como un error cuando se compila el cdigo:

    let cannotBeNegative: UInt8 = -1 // Uint8 no puede almacenar nmeros negativos, por lo que esta informar de un error

    let tooBig: Int8 = Int8.max + 1 // INT8 no puede almacenar un nmero mayor que su valor mximo,

    // Y por lo que este tambin informar de un error Debido a que cada tipo numrico puede almacenar una serie diferente de valores, debe optar por la conversin de tipo numrico sobre una base caso por caso. Este enfoque opt-in evita errores de conversin ocultos y ayuda a que las intenciones de conversin de tipo explcita en el cdigo. Para convertir un tipo determinado nmero a otro, se inicializa un nuevo nmero del tipo deseado con el valor existente. En el siguiente ejemplo, la constante de twoThousand es de tipo UInt16 , mientras que la constante de uno es de tipo Uint8 . No se pueden sumar directamente, porque no son del mismo tipo. En cambio, este ejemplo llama UInt16 (uno) para crear una nueva UInt16 inicializado con el valor de uno , y utiliza este valor en lugar de la original:

    let twoThousand: UInt16 = 2_000 let one: UInt8 = 1 let twoThousandAndOne = twoThousand + UInt16(one)

  • 27

    Debido a que ambos lados de la adicin son ahora de tipo UInt16 , se permite la adicin. La constante de salida ( twoThousandAndOne ) se infiere a ser de tipo UInt16 , porque es la suma de dos UINT16 valores. SomeType (ofInitialValue) es la forma predeterminada para llamar al inicializador de tipo Swift y pase un valor inicial. Detrs de las escenas, UInt16 tiene un inicializador que acepta un Uint8 valor, y por lo que este inicializador se utiliza para hacer un nuevo UInt16 de una existente Uint8 . No se puede pasar en cualquiertipo aqu, sin embargo, tiene que ser un tipo para el que UInt16 proporciona un inicializador. La extensin de los tipos existentes para proporcionar inicializadores que acepten nuevos tipos (incluyendo sus propias definiciones de tipos) que se cubre en las extensiones . Entero y en coma flotante Conversin Las conversiones entre nmeros enteros y de punto flotante tipos numricos deben hacerse explcitas:

    let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine

    // Pi es igual a 3.14159, y se infiere a ser de tipo doble Aqu, el valor de la constante de tres se utiliza para crear un nuevo valor de tipo doble , de modo que ambos lados de la adicin son del mismo tipo. Sin esta conversin en su lugar, la adicin no se le permitira. De punto flotante de conversin entera tambin debe hacerse explcito. Un tipo entero se puede inicializar con un doble o Float valor:

    let integerPi = Int(pi) // IntegerPi es igual a 3, y se infiere a ser de tipo Int

    Los valores de coma flotante siempre se truncan cuando se utiliza para inicializar un nuevo valor de nmero entero de esta manera. Esto significa que 4,75 se convierte en 4 , y -3,9 convierte -3 . N O T A Las reglas para combinar las constantes numricas y variables son diferentes de las reglas para los literales numricos. El valor literal 3 se puede agregar directamente al valor literal 0.14159 , porque literales numricos no tienen un tipo explcito en s mismos. Su tipo es inferido slo en el punto de que son evaluados por el compilador. Tipo de los nombres Tipo alias definen un nombre alternativo para un tipo existente. Usted define los alias de tipo con el typealiaspalabra clave. Tipo alias son tiles cuando se quiere hacer referencia a un tipo existente por un nombre que es contextualmente ms apropiado, por ejemplo, cuando se trabaja con datos de un tamao especfico de una fuente externa:

    typealias AudioSample = UInt16 Una vez que se define un alias de tipo, puede utilizar el alias de cualquier lugar que podra utilizar el nombre original:

    var maxAmplitudeFound = AudioSample.min

  • 28

    // MaxAmplitudeFound es ahora 0 Aqu, AudioSample se define como un alias para UInt16 . Debido a que es un alias, la llamada aAudioSample.min llama en realidad UInt16.min , que proporciona un valor inicial de 0 para el maxAmplitudeFoundvariable. Booleanos Swift tiene un bsico de Boole tipo, llamado Bool . Los valores booleanos se les conoce como lgica , ya que slo alguna vez pueden ser verdaderas o falsas. Swift proporciona dos valores constantes booleanas,verdaderas y falsas :

    let orangesAreOrange = true let turnipsAreDelicious = false

    Los tipos de orangesAreOrange y turnipsAreDelicious se han deducido como Bool del hecho de que se inicializan con valores literales booleanos. Al igual que con Int y doble arriba, usted no tiene que declarar constantes o variables como Bool Si se ajustan a la verdad o falso tan pronto a medida que los crea. La inferencia de tipos ayuda a que el cdigo Swift ms concisa y fcil de leer cuando se inicializa las constantes o variables con otros valores cuyo tipo ya se conoce. Los valores booleanos son particularmente tiles cuando se trabaja con sentencias condicionales tales como el caso de la declaracin:

    if turnipsAreDelicious { println("Mmm, tasty turnips!") } else { println("Eww, turnips are horrible.") } // prints "Eww, turnips are horrible."

    Sentencias condicionales tales como el caso de la declaracin se cubren con ms detalle en el control de flujo. Seguridad de tipos de Swift evita valores no booleanos de ser sustituido por Bool . El siguiente ejemplo se informa de un error de tiempo de compilacin:

    let i = 1 if i {

    // Este ejemplo no se compilar, y se informar de un error }

    Sin embargo, el ejemplo alternativo a continuacin es vlido: let i = 1 if i == 1 {

    // Este ejemplo se compilar con xito }

    El resultado de la i == 1 comparacin es de tipo Bool , y por lo que este segundo ejemplo del tipo pasa-cheque. Las comparaciones como i == 1 se discuten en Operadores bsicos .

  • 29

    Al igual que con otros ejemplos de tipo de seguridad en Swift, este enfoque evita errores accidentales y asegura que la intencin de una seccin particular de cdigo es siempre clara. Las tuplas Las tuplas grupo de valores mltiples en un nico valor compuesto. Los valores dentro de una tupla pueden ser de cualquier tipo y no tienen que ser del mismo tipo que la otra. En este ejemplo, (404, "Not Found") es una tupla que describe un cdigo de estado HTTP . Un cdigo de estado HTTP es un valor especial retornado por un servidor web cada vez que solicita una pgina web. Un cdigo de estado de 404 Not Found se devuelve si usted solicita una pgina web que no existe.

    let http404Error = (404, "Not Found") // Http404Error es de tipo (int, String), y es igual a (404, "Not Found") El (404, "Not Found") grupos de tupla juntos un Int y una cadena para dar el cdigo de estado HTTP dos valores distintos: un nmero y una descripcin legible. Puede ser descrito como "una tupla de tipo (int, String) ". Puede crear tuplas de cualquier permutacin de tipos, y que puede contener muchos tipos diferentes como desee. No hay nada que nos impida tener una tupla de tipo (Int, Int, Int) , o (String, Bool) , o de hecho cualquier otra permutacin usted requiere. Puede descomponer el contenido de una tupla en constantes o variables independientes, que luego accede como de costumbre:

    let (statusCode, statusMessage) = http404Error println("The status code is \(statusCode)") // prints "The status code is 404" println("The status message is \(statusMessage)") // prints "The status message is Not Found"

    Si slo necesita algunos de los valores de la tupla, ignorar partes de la tupla con un guin bajo ( _ ) cuando se descompone la tupla:

    let (justTheStatusCode, _) = http404Error println("The status code is \(justTheStatusCode)") // prints "The status code is 404"

    Alternativamente, acceder a los valores de los elementos individuales de una tupla usando nmeros de ndice a partir de cero:

    println("The status code is \(http404Error.0)") // prints "The status code is 404" println("The status message is \(http404Error.1)") // prints "The status message is Not Found"

    // Impresiones "El mensaje de estado no se encuentra" Usted puede nombrar a los elementos individuales de una tupla cuando se define la tupla:

  • 30

    dejar http200Status = ( statuscode : 200 , Descripcin : "OK" ) Si el nombre de los elementos de una tupla, puede utilizar los nombres de los elementos para tener acceso a los valores de esos elementos:

    println("The status code is \(http200Status.statusCode)") // prints "The status code is 200" println("The status message is \(http200Status.description)") // prints "The status message is OK"

    Las tuplas son particularmente tiles como los valores de retorno de las funciones. Una funcin que intenta recuperar una pgina web puede devolver el (Int, String) Tipo de tupla para describir el xito o el fracaso de la recuperacin de la pgina. Al devolver una tupla con dos valores distintos, cada uno de un tipo diferente, la funcin proporciona informacin ms til sobre su resultado que si slo poda devolver un solo valor de un solo tipo. Para obtener ms informacin, vea Funciones con mltiples valores de retorno . N O T A Las tuplas son tiles para los grupos temporales de valores relacionados. No son adecuados para la creacin de estructuras de datos complejas. Si es probable que persistan ms all de un alcance temporal, lo representan como una clase o estructura, ms que como una tupla de su estructura de datos. Para obtener ms informacin, vea Clases y Estructuras . Opcionales Utiliza opcionales en situaciones en que un valor puede estar ausente. Un opcional dice: No es un valor, y es igual a x o All no es un valor en absoluto N O T A El concepto de opcionales no existe en C o Objective-C. Lo ms cercano en Objective-C es la capacidad de volver a cero de un mtodo que de otra manera devolver un objeto, con nula que significa "la ausencia de un objeto vlido." Sin embargo, esto slo funciona para los objetos-no funciona para las estructuras , tipos bsicos de C, o valores de enumeracin. Para estos tipos, mtodos de Objective-C normalmente devuelven un valor especial (como NSNotFound ) para indicar la ausencia de un valor. Este enfoque asume que la persona que llama del mtodo sabe que hay un valor especial para probar en contra y recuerda a comprobar por ello. Opcionales de Swift permiten indicar la ausencia de un valor de cualquier tipo en absoluto , sin la necesidad de constantes especiales. He aqu un ejemplo de cmo opcionales pueden utilizarse para hacer frente a la ausencia de un valor. De Swift Cadena tipo tiene un mtodo llamado Toint , que trata de convertir una Cadena de valor en un Int valor.Sin embargo, no todos los cadena se puede convertir en un entero. La cadena "123" se puede convertir en el valor numrico 123 , pero la cadena "hola, mundo" no tiene un valor numrico obvio para convertir. El ejemplo siguiente utiliza la Toint mtodo para tratar de convertir una cuerda en un Int :

  • 31

    let possibleNumber = "123" let convertedNumber = possibleNumber.toInt()

    // ConvertedNumber se infiere a ser de tipo "Int?", O "Int opcional" Debido a que el Toint mtodo puede fallar, devuelve un opcional Int , en lugar de un int . Un opcional Int se escribe como Int? , no Int . El signo de interrogacin indica que el valor que contiene es opcional, lo que significa que puede contener algn Int valor, o podra contener ningn valor en absoluto . (No puede contener cualquier otra cosa, como por ejemplo un Bool valor o una Cadena de valor. Es o un int , o no es nada en absoluto.) nil Se establece una variable opcional a un estado sin valor asignndole el valor especial nulo :

    var serverResponseCode: Int? = 404 // ServerResponseCode contiene un valor real Int de 404 serverResponseCode = nil // ServerResponseCode ahora no contiene ningn valor

    N O T A nil no se puede utilizar con constantes y variables no opcional. Si una constante o variable en el cdigo tiene que trabajar con la ausencia de un valor bajo ciertas condiciones, siempre declararemos como un valor opcional del tipo apropiado. Si se define una constante o variable opcional sin proporcionar un valor por defecto, la constante o variable se ajusta automticamente a cero para usted:

    var surveyAnswer : Cadena ? // SurveyAnswer se ajusta automticamente a cero

    N O T A De Swift nil no es lo mismo que cero en Objective-C. En Objective-C, nil es un puntero a un objeto inexistente. En Swift, nil no es un puntero-es la ausencia de un valor de un cierto tipo. Opcionales decualquier tipo se pueden establecer en cero , no slo tipos de objetos. Si Las declaraciones y forzado Unwrapping Puede utilizar un si declaracin para averiguar si un opcional contiene un valor comparando el opcional contra cero . Se realiza esta comparacin con la "igual a" operador ( == ) o el "no es igual a" operador ( ! = ). Si una opcin tiene un valor, se considera que "no es igual a" cero :

    if convertedNumber != nil { println("convertedNumber contains some integer value.") } // prints "convertedNumber contains some integer value."

    Una vez que est seguro de que la opcional hace contener un valor, puede acceder a su valor subyacente mediante la adicin de un signo de exclamacin ( ! ) al final del nombre de la opcin. El signo de exclamacin efectivamente dice, "Yo s que esta

  • 32

    opcin sin duda tiene un valor; por favor use "Esto se conoce como.desenvolver forzado del valor de la opcin:

    if convertedNumber != nil { println("convertedNumber has an integer value of \(convertedNumber!).") }

    // Impresiones "convertedNumber tiene un valor entero de 123" Para ms informacin sobre el caso de la declaracin, vase el control de flujo . N O T A Tratar de utilizar ! acceder a un valor opcional inexistente provoca un error de ejecucin. Asegrese siempre de que un opcional contiene una no- nil valor antes de usar ! forzar-desenvolver su valor. Opcional Binding Utiliza unin opcional para averiguar si un opcional contiene un valor, y si es as, haga que el valor disponible como una constante o variable temporal. Opcional unin se puede utilizar con si y mientras declaraciones para comprobar un valor dentro de un opcional, y para extraer ese valor en una constante o variable, como parte de una sola accin. si y mientras estados se describen con ms detalle en el control de flujo . Escribe enlaces opcionales para el caso de la declaracin de la siguiente manera:

    if let constantName = someOptional {

    statements

    } Puede volver a escribir la possibleNumber ejemplo del Opcionales seccin para utilizar opcional desenvolver vinculante y no forzada:

    if let actualNumber = possibleNumber.toInt() { println("\(possibleNumber) has an integer value of \(actualNumber)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123"

    Este cdigo se puede leer como: "Si el opcional Int devuelve possibleNumber.toInt contiene un valor, establece una nueva constante llamadaactualNumber al valor contenido en la opcional. " Si la conversin se realiza correctamente, el actualNumber constante est disponible para su uso dentro de la primera rama del si comunicado. Ya se ha inicializado con el valor contenido dentro de la opcional, y as que no hay necesidad de utilizar el ! sufijo para acceder a su valor. En este ejemplo, actualNumber se utiliza simplemente para imprimir el resultado de la conversin. Puede utilizar ambas constantes y variables con opcin de encuadernacin. Si quera manipular el valor deactualNumber dentro de la primera rama del si declaracin,

  • 33

    usted podra escribir si actualNumber var su lugar, y el valor contenido en el opcional se pondran a disposicin como una variable en lugar de una constante. Implcitamente Unwrapped Opcionales Como se describi anteriormente, opcionales indican que se permite una variable constante o tener "ningn valor". Opcionales pueden ser comprobadas con un caso de declaracin para ver si existe un valor, y puede ser condicionalmente desenvolvi con opcional de unin para acceder a el valor de la opcin, si es que existe. A veces se desprende de la estructura de un programa que una opcin ser siempre tener un valor, despus de que el valor se establece en primer lugar. En estos casos, es til para eliminar la necesidad de comprobar y desenvolver el valor de la opcional cada vez que se accede, porque se puede suponer con seguridad a tener un valor todo el tiempo. Este tipo de opcionales se definen como opcionales implcitamente abierto . Usted escribe un implcitamente envolver opcional colocando un signo de exclamacin ( cuerda! ) en lugar de un signo de interrogacin (Cadena? ) despus de que el tipo que desea que sea opcional. Implcitamente opcionales abierto son tiles cuando el valor de un opcional se confirma que existe inmediatamente despus de la opcional se define primero y definitivamente se puede suponer que existe en cada punto a partir de entonces. El uso principal de opcionales implcitamente abierto en Swift es durante la inicializacin de clase, como se describe en las referencias sin propietario e implcitamente Unwrapped propiedades opcionales . Un opcional implcitamente envolver es una opcin normal de detrs de las escenas, pero tambin se puede utilizar como un valor no opcional, sin la necesidad de desenvolver el valor opcional cada vez que se accede.El siguiente ejemplo muestra la diferencia de comportamiento entre una cadena opcional y una cadena opcional implcitamente desenvuelto al acceder a su valor envuelto como un explcito Cadena :

    let possibleString: String? = "An optional string." let forcedString: String = possibleString! // requires an exclamation mark let assumedString: String! = "An implicitly unwrapped optional string." let implicitString: String = assumedString // no need for an exclamation mark

    Usted puede pensar en una forma implcita envolver opcional como dar permiso para que el facultativo de desenvolverse de forma automtica cada vez que se utiliza. En lugar de colocar un signo de exclamacin despus del nombre de la opcin cada vez que lo use, se coloca un signo de exclamacin despus de tipo de la opcin al declararla. N O T A Si intenta acceder a una implcita envolver opcional cuando no contiene un valor, se activar un error de ejecucin. El resultado es exactamente el mismo que si se coloca un signo de exclamacin despus de un opcional normal que no contenga un valor. Todava se puede tratar una opcional implcitamente sin envolver como un opcional normal, para comprobar si contiene un valor:

    if assumedString != nil { println(assumedString) }

  • 34

    // imprime "una cadena opcional implcitamente sin envolver." Tambin puede utilizar una forma implcita envolver opcional con opcional de unin, para comprobar y desenvolver su valor en una sola sentencia:

    if let definiteString = assumedString { println(definiteString) }

    // imprime "una cadena opcional implcitamente sin envolver." N O T A No utilice un implcitamente sin envolver opcional cuando hay una posibilidad de convertirse en una variablenula en un punto posterior. Utilice siempre un tipo opcional normal si usted necesita para comprobar si hay un nulo valor durante la vida de una variable. Aseveraciones Opcionales te permite comprobar los valores que pueden o no existir, y para escribir cdigo que hace frente con gracia con la ausencia de un valor. En algunos casos, sin embargo, simplemente no es posible que el cdigo para continuar la ejecucin si el valor no existe, o si un valor proporcionado no cumple ciertas condiciones. En estas situaciones, se puede desencadenar una afirmacin en su cdigo para poner fin a la ejecucin de cdigo y proporcionar una oportunidad para depurar la causa del valor ausente o no vlido. Depuracin con afirmaciones Una afirmacin es un cheque en tiempo de ejecucin que una condicin lgica definitivamente se evala como verdadera . Literalmente palabras, una afirmacin "afirma" que una condicin es verdadera. Utiliza una afirmacin para asegurarse de que una condicin esencial se satisface antes de ejecutar cualquier cdigo adicional. Si la condicin se evala como verdadera , la ejecucin de cdigo contina como de costumbre; si la condicin se evala como falsa , la ejecucin de cdigo termina, y su aplicacin se termina. Si su cdigo desencadena una afirmacin mientras se ejecuta en un entorno de depuracin, tales como cuando se construye y ejecuta una aplicacin en Xcode, se puede ver exactamente dnde se produjo el estado no vlido y consultar el estado de su aplicacin en el momento en que la afirmacin fue provocado.Una afirmacin tambin le permite proporcionar un mensaje de depuracin adecuado en cuanto a la naturaleza de la asercin. Usted escribe una afirmacin llamando al mundial afirman funcin. Se pasa la asercin funcin de una expresin que se evala como verdadera o falsa y un mensaje que se debe mostrar si el resultado de la condicin es falsa :

    let age = -3 assert(age >= 0, "A person's age cannot be less than zero")

    // Esto hace que la afirmacin para disparar, porque la edad no es> = 0

  • 35

    En este ejemplo, la ejecucin de cdigo continuar slo si la edad> = 0 se evala como verdadera , es decir, si el valor de la edad es no negativo. Si el valor de la edad es negativo, como en el cdigo anterior, a continuacin, la edad> = 0 se evala como falsa , y la afirmacin se activa, de terminar la aplicacin. El mensaje afirmacin puede omitirse si se desea, como en el siguiente ejemplo:

    afirmar ( edad > = 0 ) Cundo utilizar aserciones Utilice una afirmacin cada vez que un estado tiene el potencial de ser falsa, pero debe sin duda ser verdad para que su cdigo para continuar la ejecucin. Escenarios adecuados para una comprobacin de asercin incluyen: Un ndice subndice entero se pasa a una aplicacin subndice de encargo, pero el

    valor del ndice subndice podra ser demasiado baja o demasiado alta. Un valor se pasa a una funcin, pero un valor no vlido significa que la funcin no

    puede cumplir su tarea. Un valor opcional es actualmente nula , sino un no- nil de valor es esencial para

    el cdigo subsiguiente para ejecutar con xito. Ver tambin subndices y Funciones . N O T A Las afirmaciones hacen que su aplicacin para terminar y no son un sustituto para el diseo de su cdigo de tal manera que las condiciones no vlidas es improbable que surjan. No obstante, en situaciones donde las condiciones no vlidas son posibles, una afirmacin es una forma eficaz de garantizar que dichas condiciones se resaltan y se dieron cuenta durante el desarrollo, antes de la publicacin de su aplicacin. A Swift tour Operadores bsicos

  • 36

    Operadores bsicos En esta pgina Un operador es un smbolo especial o una frase que se utiliza para comprobar, cambiar o combinar los valores. Por ejemplo, el operador de suma ( + ) suma dos nmeros juntos (como en let i = 1 + 2 ). Ejemplos ms complejos incluyen el operador lgico AND && (como en el caso de enteredDoorCode && passedRetinaScan) y el operador de incremento ++ i , que es un acceso directo para aumentar el valor de i por 1 . Swift es compatible con los operadores de C ms estndar y mejora varias funciones para eliminar los errores comunes de codificacin. El operador de asignacin ( = ) no devuelve un valor, para evitar que sea utilizado por error cuando el operador igual a ( == ) se destina. Los operadores aritmticos ( + , - , * , / , % , etc) y no permiten detectar desbordamiento valor, para evitar resultados inesperados cuando se trabaja con los nmeros que se convierten en mayor o menor que el rango de valores permitido del tipo que los almacena.Usted puede optar por el comportamiento de desbordamiento de valor mediante el uso de operadores de desbordamiento de Swift, como se describe en Operadores de desbordamiento . A diferencia de C, Swift le permite realizar resto ( % ) clculos sobre nmeros de punto flotante. Swift tambin proporciona dos operadores de rango ( un ..

  • 37

    Si el lado derecho de la asignacin es una tupla con mltiples valores, sus elementos se pueden descomponer en varias constantes o variables a la vez:

    let (x, y) = (1, 2) // x is equal to 1, and y is equal to 2

    A diferencia del operador de asignacin en C y Objective-C, el operador de asignacin en Swift s mismo no devuelve ningn valor. La siguiente declaracin no es vlida:

    if x = y { // Esto no es vlido, ya que x = y no devuelve un valor }

    Esta funcin evita que el operador de asignacin ( = ) se utilice por accidente cuando el operador igual a ( == ) se destina en realidad. Al hacer si x = y no vlida, Swift le ayuda a evitar este tipo de errores en el cdigo. Operadores aritmticos Swift es compatible con los cuatro estndares operadores aritmticos para todos los tipos de nmeros: Suma ( + ) Resta ( - ) Multiplicacin ( * ) Divisin ( / )

    1 + 2 // equals 3 5 - 3 // equals 2 2 * 3 // equals 6 10.0 / 2.5 // equals 4.0

    A diferencia de los operadores aritmticos en C y Objective-C, los operadores aritmticos Swift no permiten valores se desborden por defecto. Usted puede optar por el comportamiento de desbordamiento de valor mediante el uso de operadores de desbordamiento de Swift (como a & + b ). Ver Operadores de desbordamiento . El operador de suma tambin es apoyado por Cadena concatenacin:

    "hello, " + "world" // equals "hello, world" Dos caracteres valores, o uno de caracteres de valor y uno de cadena de valor, se pueden sumar para hacer una nueva Cadena de valor:

    let dog: Character = "" let cow: Character = "" let dogCow = dog + cow // dogCow is equal to ""

    Ver tambin concatenar cadenas y caracteres . Operador resto El operador de resto ( a% b ) resuelve cuntos mltiplos de b cabrn dentro de una y devuelve el valor que queda (conocido como el resto ). N O T A

  • 38

    El operador resto ( % ) tambin se conoce como un operador de mdulo en otros idiomas. Sin embargo, su comportamiento en Swift para los nmeros negativos significa que es, estrictamente hablando, un resto ms que una operacin de mdulo. He aqu cmo funciona el operador resto. Para calcular el 9% 4 , primero calcular cuntos 4 s se ajuste dentro de 9 :

    Puede encajar dos 4 s interior 9 , y el resto es 1 (se muestra en color naranja).

    En Swift, esto se escribe como:

    9 % 4 // equals 1

    Para determinar la respuesta para a% b , el % del operador calcula la siguiente ecuacin y devuelve restocomo salida:

    un = ( b algunos multiplicador ) + resto

    donde algunos multiplicador es el mayor nmero de mltiplos de b que caben dentro de una . Insercin de 9 y 4 en esta ecuacin se obtiene: 9 = ( 4 2 ) + 1 El mismo mtodo se aplica al calcular el resto para un valor negativo de una :

    - 9 % 4 // es igual a -1 Insercin de -9 y 4 en los rendimientos ecuacin: -9 = ( 4 -2 ) + -1 dando un valor resto de -1 . El signo de b es ignorado por los valores negativos de b . Esto significa que a% b y un -b% siempre dan la misma respuesta. Clculos Resto en coma flotante A diferencia del operador resto en C y Objective-C, el operador resto de Swift tambin puede funcionar con nmeros de punto flotante:

    8 % 2,5 // es igual a 0,5 En este ejemplo, 8 dividido por 2,5 es igual a 3 , con un resto de 0,5 , por lo que el operador devuelve un restoDoble valor de 0,5 .

    Los operadores de incremento y decremento Al igual que C, Swift ofrece un operador de incremento ( ++ ) y un operador de decremento ( - ) como un acceso directo para aumentar o disminuir el valor de una variable numrica por 1 . Puede utilizar estos operadores con variables de cualquier nmero entero o tipo de punto flotante.

  • 39

    var i = 0 ++i // i now equals 1

    Cada vez que se llama ++ i , el valor de i se incrementa en 1 . Esencialmente, ++ i es un atajo para decir i = i + 1 Del mismo modo,. --i se puede utilizar como forma abreviada de i = i - 1 . El ++ y - smbolos pueden ser utilizados como operadores de prefijo o como operadores de sufijo. ++ i y i ++son dos formas vlidas para aumentar el valor de i por 1 . Del mismo modo, --i y i-- son dos formas vlidas para disminuir el valor de i por 1 . Tenga en cuenta que estos operadores modifican i y tambin devuelven un valor. Si slo desea aumentar o disminuir el valor almacenado en i , puede ignorar el valor devuelto. Sin embargo, si usted no utiliza el valor devuelto, que ser diferente en funcin de si ha utilizado la versin prefijo o de sufijo del operador, de acuerdo con las siguientes reglas: Si el operador est escrito antes de la variable, se incrementa la variable antes

    de devolver su valor. Si el operador est escrito despus de la variable, se incrementa la variable despus

    de regresar de su valor. Por ejemplo:

    var a = 0 let b = ++a // a and b are now both equal to 1 let c = a++

    // A es igual a 2, pero c se ha establecido en el valor pre-incremento de 1 En el ejemplo anterior, sea b = ++ un incrementos de un antes de devolver su valor. Esta es la razn por tantouna y b son iguales a al nuevo valor de 1 . Sin embargo, dej c = a ++ incrementa un despus de regresar de su valor. Esto significa que c recupera el antiguo valor de 1 , y un entonces se actualiza para igualar 2 . A menos que necesite el comportamiento especfico de i ++ , se recomienda que usted utilice ++ i y --i en todos los casos, debido a que tienen el comportamiento esperado tpica de modificar i y devolviendo el resultado. Operador menos unario El signo de un valor numrico se puede activar mediante un prefijo - , conocido como el operador menos unario :

    let three = 3 let minusThree = -three // minusThree equals -3 let plusThree = -minusThree // plusThree equals 3, or "minus minus three"

    El operador unario menos ( - ) se antepone directamente ante el valor que opera en, sin ningn espacio en blanco.

  • 40

    Operador unario Plus El operador unario ms ( + ) simplemente devuelve el valor que opera en, sin ningn cambio:

    let minusSix = -6 let alsoMinusSix = +minusSix // alsoMinusSix equals -6

    Aunque el operador de suma unaria no hace nada, se puede utilizar para proporcionar simetra en su cdigo para nmeros positivos cuando tambin mediante el operador unario menos para los nmeros negativos. Operadores de Asignacin Compuesto Al igual que C, Swift proporciona operadores de asignacin compuestos que combinan de asignacin ( = ) con otra operacin. Un ejemplo es el operador de asignacin de suma ( + = ):

    var a = 1 a += 2

    // a es ahora igual a 3 La expresin a + = 2 es la abreviatura de a = a + 2 . Efectivamente, la adicin y la asignacin se combinan en un operador que realiza ambas tareas al mismo tiempo. N O T A Los operadores de asignacin compuestos no devuelven un valor. No se puede escribir al B = a + = 2 , por ejemplo. Este comportamiento es diferente de los operadores de incremento y decremento mencionados anteriormente. Una lista completa de operadores de asignacin compuestos se puede encontrar en las expresiones . Operadores de comparacin Swift es compatible con todos los C estndar operadores de comparacin : Igual a ( a == b ) No es igual a ( a! = b ) Mayor que ( a> b ) Menos de ( a = b ) Menor o igual a ( a 1 // cierto, porque 2 es mayor que 1 1 < 2 // cierto, porque 1 es menor que 2 1 > = 1 // cierto, porque 1 es mayor que o igual a 1 2

  • 41

    Los operadores de comparacin se utilizan a menudo en las sentencias condicionales, como el caso de la declaracin if:

    let name = "world" if name == "world" { println("hello, world") } else { println("I'm sorry \(name), but I don't recognize you") }

    // imprime "hola, mundo", porque el nombre es de hecho igual al "mundo" Para ms informacin sobre el caso de la declaracin, vase el control de flujo . Operador condicional ternario El operador condicional ternario es un operador especial con tres partes, que toma la forma pregunta?answer1: Respuesta2 . Es un acceso directo para la evaluacin de una de las dos expresiones en funcin de sipregunta es verdadera o falsa. Si pregunta es verdadera, evala answer1 y devuelve su valor; de lo contrario, se evala Respuesta2 y devuelve su valor. El operador condicional ternario es una abreviacin para el cdigo de abajo:

    if question { answer1 } else { answer2 }

    He aqu un ejemplo, que calcula la altura de una fila de tabla. La altura de la fila debe ser de 50 puntos ms alto que la altura del contenido si la fila tiene una cabecera, y 20 puntos ms alto si la fila no tiene un encabezado:

    dejar que contentHeight = 40 dejar HasHeader = true dejar rowHeight = contentHeight + ( HasHeader ? 50 : 20 ) // RowHeight es igual a 90

    El ejemplo anterior es una abreviatura para el cdigo de abajo: let contentHeight = 40 let hasHeader = true var rowHeight = contentHeight if hasHeader { rowHeight = rowHeight + 50 } else { rowHeight = rowHeight + 20 }

  • 42

    // RowHeight es igual a 90 El primer uso del ejemplo del operador condicional ternario significa que rowHeight se puede establecer en el valor correcto en una sola lnea de cdigo. Esto es ms conciso que el segundo ejemplo, y elimina la necesidad de rowHeight a una variable, porque su valor no necesita ser modificado dentro de un sideclaracin. El operador condicional ternario proporciona una taquigrafa eficiente para decidir cul de las dos expresiones a considerar. Utilice el operador condicional ternario con cuidado, sin embargo. Su concisin puede conducir al cdigo difcil de leer si se abusa. Evite combinar varias instancias del operador condicional ternario en una sentencia compuesta. Ninguna Coalescente Operador El operador de coalescencia nula ( a ?? b ) desenvuelve opcional un si contiene un valor, o devuelve un valor predeterminado b si una es nula . La expresin una siempre es de un tipo opcional. La expresin b debe coincidir con el tipo que se almacena dentro de una . El operador de coalescencia nil es un atajo para el cdigo de abajo:

    a != nil ? a! : b El cdigo anterior utiliza el operador condicional ternario y desenvolver forzada ( una! ) para acceder al valor envuelto en una cuando una no es nula , ya regresar b lo contrario. El operador de coalescencia nil ofrece una forma ms elegante para encapsular esta comprobacin condicional y desenvolver de una forma concisa y fcil de leer. N O T A Si el valor de una es no nulo , el valor de b no se evala. Esto se conoce como evaluacin de corto-circuito . El ejemplo siguiente utiliza el operador de coalescencia nil que elegir entre un nombre de color por defecto y un nombre de color definido por el usuario opcional:

    let defaultColorName = "red" var userDefinedColorName: String? // defaults to nil var colorNameToUse = userDefinedColorName ?? defaultColorName

    // UserDefinedColorName es nula, por lo colorNameToUse se establece en el valor predeterminado de "rojo" El userDefinedColorName variable se define como un opcional de cuerda , con un valor por defecto de cero .Debido userDefinedColorName es de tipo opcional, puede utilizar el operador de coalescencia nil considerar su valor. En el ejemplo anterior, el operador se utiliza para determinar un valor inicial para una cadena variable llamada colorNameToUse . Debido userDefinedColorName es nula , la expresin userDefinedColorName ??defaultColorName devuelve el valor de defaultColorName , o "rojo" .

  • 43

    Si asigna un no- nil valor a userDefinedColorName y ejecutar la revisin operador coalescente nula de nuevo, el valor envuelto dentro userDefinedColorName se utiliza en lugar del predeterminado:

    userDefinedColorName = "green" colorNameToUse = userDefinedColorName ?? defaultColorName

    // UserDefinedColorName no es nula, por lo colorNameToUse se establece en "verde"

  • 44

    Operadores Range Swift incluye dos operadores de rango , que son atajos para expresar un rango de valores. Cerrado operador Range El operador de rango cerrado ( un ... b ) define un rango que va desde una a b , e incluye los valores de una yb . El valor de un no debe ser mayor que b . El operador de rango cerrado es til cuando se repite en un intervalo en el que desea que todos los valores a utilizar, por ejemplo, con un para - en bucle:

    for index in 1...5 { println("\(index) times 5 is \(index * 5)") } // 1 times 5 is 5 // 2 times 5 is 10 // 3 times 5 is 15 // 4 times 5 is 20 // 5 times 5 is 25

    Para ms informacin sobre por - en bucles, consulte Flujo de control . La mitad-Open Operator Range El operador entreabierta gama ( un ..

  • 45

    Operadores lgicos Los operadores lgicos modificar o combinar los valores lgicos booleanos true y false . Swift es compatible con los tres operadores lgicos estndar que se encuentran en los idiomas basados en C: Logical NOT (!a) Logical AND (a && b) Logical OR (a || b)

    Logical NOT Operator

    El operador lgico NOT ( ! a) invierte un valor booleano para que verdadera se convierte en falsa , y falsase convierte en verdadera . El operador lgico NOT es un operador prefijo, y aparece inmediatamente antes del valor que opera en, sin ningn espacio en blanco. Se puede leer como "no una ", como se ve en el siguiente ejemplo:

    let allowedEntry = false if !allowedEntry { println("ACCESS DENIED") } // prints "ACCESS DENIED"

    La frase ! si allowedEntry se puede leer como "si no se permite la entrada." La lnea posterior slo se ejecuta si "no entrada permitida" es cierto; es decir, si allowedEntry es falsa . Como en este ejemplo, la eleccin cuidadosa de nombres de constantes y variables booleanas puede ayudar a mantener el cdigo legible y conciso, evitando dobles negaciones o afirmaciones lgicas confusas. Y lgico Operador El operador lgico Y ( a && b ) crea expresiones lgicas donde ambos valores deben ser verdad para la expresin general que tambin sea cierto . Si alguno de los valores es falso , la expresin general tambin ser falsa . De hecho, si el primer valor esfalso , el segundo valor de ni siquiera ser evaluada, ya que no puede hacer la expresin global equivale a laverdad . Esto se conoce como evaluacin de corto-circuito . En este ejemplo se considera dos Bool valores y slo permite el acceso si ambos valores son true :

    let enteredDoorCode = true let passedRetinaScan = false if enteredDoorCode && passedRetinaScan { println("Welcome!") } else { println("ACCESS DENIED") }

  • 46

    // prints "ACCESS DENIED"

    Operador lgico OR El operador lgico OR ( a || b ) es un operador infijo hecho a partir de dos personajes de tuberas adyacentes. Se utiliza para crear expresiones lgicas en las que slo uno de los dos valores tiene que serverdadera para la expresin general para ser verdad . Al igual que el operador lgico AND anterior, el operador lgico OR utiliza la evaluacin de cortocircuito para considerar sus expresiones. Si el lado izquierdo de una expresin lgica OR es verdadera , no se evala el lado derecho, porque no puede cambiar el resultado de la expresin general. En el siguiente ejemplo, la primera Bool valor ( hasDoorKey ) es falsa , pero el segundo valor (knowsOverridePassword ) es verdadera . Debido a que un valor es verdadero , la expresin general tambin se evala como verdadera , y se permite el acceso:

    let hasDoorKey = false let knowsOverridePassword = true if hasDoorKey || knowsOverridePassword { println("Welcome!") } else { println("ACCESS DENIED") } // prints "Welcome!"

    La combinacin de operadores lgicos Puede combinar mltiples operadores lgicos para crear expresiones compuestas ms largos:

    if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { println("Welcome!") } else { println("ACCESS DENIED") } // prints "Welcome!"

    Este ejemplo utiliza mltiples && y || operadores para crear una expresin compuesta por ms tiempo. Sin embargo, el && y || operadores siguen funcionando en slo dos valores, por lo que este es en realidad tres expresiones ms pequeas encadena