3

Condicionales y Operadores - Resumen

Este es un pequeño resumen de las clases de la sección Condicionales y Operaciones Básicas. Aquí puedes encontrar código tal cual está escrito en las clases, y código que he cambiado para algunos ejemplos. Hay algunos links de referencia a la documentación de Swift para revisar los temas vistos en el curso de introducción a Swift del profesor Juan Gabriel. Si tienes algún comentario o sugerencia es bienvenido 😃

Operadores

Existen tres tipos de operadores:

  1. Unarios
  2. Binarios
  3. Ternarios
  • Asignación (Binario)
let b = 10vara = 5a = b

let (x, y) = (1, 2)

Recuerda que este operador significa: El valor de la derecha se asigna a la variable de la izquierda. Siempre.

Recuerda las formas correctas de declarar constantes y variables en Swift. Sección: Naming Constants and Variables.

The Basics - The Swift Programming Language (Swift 5.3)

  • Comparación (binario)
ifa == b
{
		print("El valor de a y b son iguales")
}

¿Es a igual a b? Sí o No

  • Aritméticos (Binario)
1 + 25 - 32 * 310.0 / 2.5

Operadores aritméticos con números, similar a C/C++

Con strings:

"Hello " + "World"

Resultado: “Hello World”, similar a Java.

Operador módulo

9 % 4

El módulo funciona igual que en C/C++. Recuerda que solo se puede puede usar con números enteros. El resultado también solo será un entero. Para trabajar números de punto flotante, ve a la sección Truncating Remainder.

La definición de módulo es el residuo de la división entre dos números. Si la división es entera, el residuo será 0. Si no es entera habrá un sobrante: por ejemplo, 9 % 4 = 1. Para llegar a ello tenemos:

Captura de Pantalla 2021-01-05 a la(s) 12.10.31 p. m..png
  • Operación
Captura de Pantalla 2021-01-05 a la(s) 12.12.57 p. m..png
  • Aritmético (Unario)
letfive = 5letminusFive = -five

letminusSix = -6letalsoMinusSix = +minusSix

El operador - en un número o una variable de tipo número le cambia el signo a este último.

El operador + le mantiene el mismo signo.

Aunque el + aparentemente no tendría utilidad, podemos usarlo con la sintaxis que también usa C o Java:

var number = 5number += 3// Equivalente anumber = number + 3number -= 2// Equivalente anumber = number - 2

Incrementar una variable en 3 y guardarla en la misma variable.

Puedes usar el resto de operaciones aritméticas:

number /= 2number *= 12number %= 7//number = number % 7

Truncating Remainder

Declaración de la función:

func truncatingRemainder(dividingBy other: [Double] -> [Double](https://developer.apple.com/documentation/swift/double)

Cumple la condición:
Captura de Pantalla 2021-01-05 a la(s) 12.13.37 p. m..png

Con esta función obtienes t, el residuo. Equivale a lo que entre enteros es: a % c = t

Similar a la ecuación escrita más arriba con el ejemplo de 9 % 4 sólo que válida para números de punto flotante, tenemos:

Captura de Pantalla 2021-01-05 a la(s) 12.14.20 p. m..png
// a = 12.5, b = 14.0, c = 0.85, t = 0.6let a1 = 12.5print(a1 / 0.85) // a/c = 14.70588... let b1 = (a1 / 0.85).rounded(.towardZero)// 14.0let t = a1.truncatingRemainder(dividingBy: 0.85)// 0.6let a2 = b1 * 0.85 + t // Comprobación a = b * c + tprint(a2) // 12.5

Si te fijas en este caso al obtener la parte entera de a/c, es decir truncando, estás obteniendo b al deshacerte del sumando t/c. Por tanto podrías obtener t despejando de la ecuación, y te dará lo mismo que la función truncatingRemainder:

Captura de Pantalla 2021-01-05 a la(s) 12.15.04 p. m..png
let t = a1.truncatingRemainder(dividingBy: 0.85)// 0.6var prueba = ( ( a1 / 0.85 ) - b1 ) * 0.85// t = ( a/c - b) * c
print(prueba) // 0.6

Por último fíjate que tal cual en la operación módulo con enteros, b es sólo la parte entera de la división a/c (como en 9/4 = 2) así estemos tratando con números double, dado que lo que falta de esta división es el residuo y es lo que queremos hallar. Es el mismo principio para ambos.


Comparaciones

Prueba este código en tu playground.

//Comparaciones
1 == 1
2 == 1
1 != 2
2 > 1
3 <= 5
2 <= 1

  • Condicionales
let name = "Juan Gabriel"if name == "Juan Gabriel"
{
    print("Bienvenido \(name)")
}else{
    print("Cuidado, ha aparecido \(name)")
}
//Output: "Bienvenido Juan Gabriel\n"

Comparación de tuplas:

(1, "Juan Gabriel") < (2, "Ricardo Celis") //true
(3, "Juan Gabriel") < (3, "Ricardo Celis") //true
(3, "Ricardo Celis") < (3, "Juan Gabriel") //false
(4, "perro") == (4, "perro") //true
//("perro", false) < ("perro", true) No tiene sentido por los booleanos
("perro", false) == ("perro", true) //false


Operador Ternario

letcontentHigh = 40
var hashImage = true
var rowHeight = 0

// 1.
if hashImage
{
    rowHeight = contentHigh + 50
}else{
    rowHeight = contentHigh + 10
}

// 2.
rowHeight = contentHigh + (hashImage ? 50 : 10) 
//Si hashImage es true, el sumando es 50\. Si es false, es 10

Si te fijas para este caso en la manera tradicional if-else estás repitiendo la misma línea de código excepto un número constante diferente para cada caso. Con la segunda manera estás logrando lo mismo sin un if-else y una vez lo memorices será muy intuitivo de usar.


Nil Coalescing

let defaultAge = 18
var userAge: Int?

userAge = 31
var ageToBeUsed = userAge ?? defaultAge 
//Con ternario ageToBeUsed = (userAge != nil ? userAge! : defaultAge)

userAge es una variable optional. La edad que va a usar el código es userAge si existe. Sino defaultAge. El ejemplo comentado con el operador ternario era tan usado que decidieron implementar el Nil Coalescing.


Rangos

El operador de rango cerrado define un rango que va de a hasta b de la siguiente manera:

  • Rango cerrado: 1…5
  • Rango semiabierto: 1…<5
  • Rango acotado por un sólo lado:
    • …5
    • 1…
//Ejemplos
for idx in1...5
{
    print(idx)
}

// 5 timesfor idx in1..<5
{
    print(idx)
}

// 4 times
  • Con arreglos:
let names = ["Ricardo", "Juan Gabriel", "Pedro"]

// 1.for i in0..count
{
    print("La persona \(i + 1) se llama \(names[i])")
}

// 2.for name in names {
    print(name)
}

// 3.for name in names[1...] {
    print(name)
}

// 4.for name in names[...2] {
    print(name)
}

// 5.for name in names[..<2] {
    print(name)
}

  1. El primer ciclo recorre el arreglo utilizando su índice: names[i]. El ciclo for no recorre directamente el arreglo, sino que itera i desde 0 hasta n-1, dónde n es el tamaño del arreglo.
  2. El segundo ciclo recorre directamente el arreglo. Declara una variable interna name que representa cada elemento del arreglo sin importar el tipo de dato.
  3. En los últimos 3 casos se recorre directamente el arreglo pero teniendo en cuenta el rango.

Operadores lógicos

  • NOT (!a)
  • AND (a && b)
  • OR (a || b)

Los operadores && y || se asocian desde la izquierda. Es decir que las expresiones compuestas se evalúan desde la sub-expresión que está más a la izquierda.

lethasMoney = falselethasInvitation = trueletenterDoorCode = trueletpassRetinaScan = falseif enterDoorCode && passRetinaScan || hasMoney || hasInvitation {
    print("Has entrado")
}else{
    print("Acceso denegado")
}

//Output: Has entrado


Recuerda que siempre puedes referirte a la documentación oficial de Swift. Los temas tratados en esta parte están la sección Basic Operators.

Escribe tu comentario
+ 2