Loading repository data…
Loading repository data…
MaferGH / repository
Repositorio donde documento mi aprendizaje de Swift desde cero, con ejercicios y ejemplos prácticos que reflejan mi progreso y comprensión del lenguaje.
Imagina que tienes una cajita donde puedes guardar cosas. Eso es exactamente lo que hace una variable: guardar información para usarla después.
En Swift, existen dos tipos de cajitas:
var → La cajita puede cambiar de contenido cuando quieras.let → La cajita está sellada. Una vez que guardas algo, ya no puedes cambiarlo. A esto se le llama constante.Se divide en tres partes:
var / let — Le dice a Swift: ¡Voy a crear una cajita!nombre — Es el nombre con el que vas a identificar tu cajita.valor — Es lo que vas a guardar dentro de la cajita.var nombre = "Fernanda García" // ✅ Se puede cambiar
let nombre2 = "Karina Silva" // 🔒 No se puede cambiar (constante)
print(nombre) // Imprime: Fernanda García
[!NOTE] La función
print()sirve para mostrar el contenido de una variable en la pantalla. ¡Es como pedirle a Swift que te diga qué hay dentro de la cajita!
[!TIP] Buena práctica: Usa
letsiempre que puedas. Solo usavarcuando sepas que el valor va a cambiar. Esto hace tu código más seguro.
Las cajitas no son todas iguales. Dependiendo de lo que quieras guardar, necesitas un tipo diferente. Swift es muy estricto con esto: ¡no puedes guardar un número en una cajita de texto!
Character — Un solo carácterSolo acepta UN carácter: una letra, un número o un símbolo.
var simbolo: Character = "e"
var corazon: Character = "\u{2665}" // Símbolo especial: ♥
print(corazon) // Imprime: ♥
String — TextoPuede guardar cualquier texto: letras, números, símbolos, frases enteras.
var nombrePerro: String = "Robin"
Int — Número enteroPara números sin decimales: 1, 42, -100, 2026.
var año: Int = 2026
Float — Número con decimales (básico)Ocupa menos espacio en memoria pero es menos preciso. Soporta hasta ~7 decimales.
var piFlat: Float = 3.1416 // Swift lo redondea un poco
print(piFlat)
Double — Número con decimales (preciso)Más preciso que Float. Usa este cuando necesites decimales con mucha exactitud.
var piDouble: Double = 3.14162738932832
print(piDouble)
Bool — Verdadero o FalsoSolo tiene dos posibles valores: true (verdadero) o false (falso). Como un interruptor de luz 💡.
var estaFeliz: Bool = true
var estaTriste: Bool = false
Swift no mezcla tipos automáticamente. Si quieres sumar un Int con un Double, debes convertirlos explícitamente.
let numeroEntero: Int = 34
let numeroDecimal: Double = 25.65
// ❌ Esto da error:
// let suma = numeroEntero + numeroDecimal
// ✅ Esto funciona (convertimos el Int a Double):
let suma: Double = Double(numeroEntero) + numeroDecimal
print(suma) // 59.65
Son como las operaciones matemáticas de siempre.
var a: Int = 5
var b: Int = 6
var suma = a + b // 11 → Suma
var resta = a - b // -1 → Resta
var multiplicar = a * b // 30 → Multiplicación
var division = b / 2 // 3 → División entera
var modulo = a % b // 5 → Residuo (lo que sobra)
[!TIP] El módulo
%te da el residuo de una división. Por ejemplo:10 % 3 = 1, porque 10 ÷ 3 = 3 y sobra 1. Es muy útil para saber si un número es par (sinum % 2 == 0, entonces es par).
Son atajos para modificar una variable de forma más rápida.
var ejemplo = 5
ejemplo = ejemplo + 10 // Forma larga
ejemplo += 10 // Forma corta (igual que arriba) ✅
ejemplo -= 5 // Resta 5
ejemplo *= 2 // Multiplica por 2
ejemplo /= 4 // Divide entre 4
ejemplo %= 3 // Guarda el residuo de dividir entre 3
Comparan dos valores y devuelven true o false.
let edad = 20
let esMayor = edad > 18 // true → Mayor que
let esMenor = edad < 18 // false → Menor que
let esIgual = edad == 20 // true → Igual que
let esDistinto = edad != 20 // false → No es igual
let menorIgual = edad <= 18 // false → Menor o igual
let mayorIgual = edad >= 18 // true → Mayor o igual
Combinan condiciones: ambas deben ser verdaderas, o al menos una.
let estaSoleado = true
let temperatura: Int = 25
// && = AND (ambas deben ser true)
let esAgradable: Bool = estaSoleado && temperatura > 25 // false
// || = OR (al menos una debe ser true)
let irPlaya: Bool = estaSoleado || temperatura > 24 // true
// ! = NOT (invierte el valor)
let llevarSombrero: Bool = !estaSoleado // false
Los condicionales le permiten a tu código tomar decisiones. En lugar de ejecutar todo de arriba hacia abajo, el programa puede elegir qué hacer dependiendo de una situación.
if / else if / elselet edadUsuario = Int.random(in: 1...30) // Número aleatorio del 1 al 30
if edadUsuario >= 18 {
print("Eres mayor de edad (\(edadUsuario))")
} else {
print("Eres menor de edad (\(edadUsuario))")
}
Encadenando varias condiciones con else if:
func saludo(_ hora: Int) {
if hora < 12 {
print("Buenos días")
} else if hora < 18 {
print("Buenas tardes")
} else {
print("Buenas noches")
}
}
saludo(18) // Imprime: Buenas noches
[!TIP] Dentro de un texto, usamos
\(nombreVariable)para insertar el valor de una variable. Es como un hueco en la oración que Swift llena automáticamente.
switch — El semáforo de múltiples opcionesCuando tienes muchas opciones posibles, el switch es más limpio y legible que un montón de else if.
func mesConSwitch(_ mes: Int) {
switch mes {
case 1: print("Enero")
case 2: print("Febrero")
case 3: print("Marzo")
// ... etc
case 12: print("Diciembre")
default: print("Mes inválido")
}
}
mesConSwitch(3) // Imprime: Marzo
switch con grupos de casosfunc trimestre(_ mes: Int) {
switch mes {
case 1, 2, 3: print("Primer Trimestre")
case 4, 5, 6: print("Segundo Trimestre")
case 7, 8, 9: print("Tercer Trimestre")
case 10, 11, 12: print("Cuarto Trimestre")
default: print("Mes inválido")
}
}
trimestre(8) // Imprime: Tercer Trimestre
switch con rangosfunc rango(_ numero: Int) {
switch numero {
case 1...10: print("Entre 1 y 10")
case 11...1000: print("Entre 11 y 1000")
default: print("Fuera de rango")
}
}
Un arreglo (Array) es como una lista de cosas del mismo tipo, ordenadas en fila. Cada elemento tiene una posición llamada índice, que empieza desde 0.
let nombres: [String] = ["Mafer", "Karina", "Abraham", "Jair"]
// 0 1 2 3 ← posiciones
print(nombres) // ["Mafer", "Karina", "Abraham", "Jair"]
print(nombres[1]) // Karina ← Posición 1
var diasSemana: [String] = ["Lunes", "Martes", "Miércoles",
"Jueves", "Viernes", "Sábado", "Domingo"]
diasSemana[4] = "Bebiernes" // Cambiamos "Viernes" por "Bebiernes" 🍻
print(diasSemana[4]) // Bebiernes
// Agregar al final
diasSemana.append("Día de San Mafer")
// Eliminar un elemento por posición
diasSemana.remove(at: 0) // Elimina "Lunes"
// Eliminar todos los elementos
// diasSemana.removeAll()
[!WARNING] Si intentas acceder a una posición que no existe, tu programa crasheará. ¡Siempre verifica que el índice exista!
Una tupla es como una cajita que guarda varios valores juntos, aunque sean de tipos diferentes.
// Tupla por posición
let persona = ("Mafer", 20, true, "Calle mi casa")
print(persona.0) // Mafer
print(persona.1) // 20
La forma más recomendada es usar etiquetas:
// Tupla etiquetada ✅
let usuario = (nombre: "Elena", edad: 25, esPremium: true)
print(usuario.nombre) // Elena
print(usuario.esPremium) // true
También puedes desempacar los valores directamente:
let (nombre, edad) = ("Carlos", 40)
print(nombre) // Carlos
Un diccionario es como un diccionario real 📖: buscas una palabra (la clave) y encuentras su definición (el valor).
var capitales = ["Francia": "París", "Italia": "Roma", "Japón": "Tokio"]
// Acceder a un valor
print(capitales["Francia"]) // Optional("París")
// Agregar o actualizar
capitales["México"] = "CDMX"
// Eliminar
capitales["Italia"] = nil
// Recorrer todos los pares
for (pais, capital) in capitales {
print("La capital de \(pais) es \(capital)")
}
En Swift, una variable normal nunca puede ser nil. Para eso existen los Opcionales, que se declaran con ? al final del tipo.
var apodo: String? = nil // Puede ser texto O puede no tener nada
print(apodo) // nil
?? (valor por defecto)print(apodo ?? "Sin apodo") // Sin apodo ← porque apodo es nil
if let — Desempacar con seguridadif let valorReal = apodo {
print("El apodo es: \(valorReal)") // Solo entra aquí si no es nil
} else {
print("No tiene apodo")
}
guard let — Salir si es nilfunc procesarApodo(_ texto: String?) {
guard let valorSeguro = texto else {
return // Salimos si es nil
}
print("Apodo: \(valorSeguro)")
}
[!WARNING] Puedes usar
variable!para decirle a Swift "¡yo sé que hay valor aquí!". Pero si en realidad esnil, tu app se va a caer. Úsalo solo cuando estés 100% seguro.
Un bucle (o ciclo) sirve para repetir una acción varias veces sin tener que escribir el mismo código una y otra vez.
for — El bucle contadorfor i in 1...7 {
print("Hola") // Se imprime 7 veces
}
Recorriendo un arreglo:
var diasSemana: [String] = ["Lunes", "Martes", "Miércoles",
"Jueves", "Viernes", "Sábado", "Domingo"]
for dia in diasSemana {
if dia == "Jueves" {
print("El día de hoy es \(dia)")
}
}
while — El bucle condicionalRepite el código mientras una condición sea verdadera.
var contador = 0
while contador < 10 {
print("Contador vale: \(contador)")
contador += 1 // ¡Importante! Si no incrementas → loop infinito 😱
}
repeat-while — Primero hago, luego preguntoEl código se ejecuta al menos una vez, porque la condición se evalúa al final.
var cuenta = 5
repeat {
print("Hola") // Se ejecuta una vez aunque cuenta no sea < 0
} while cuenta < 0
break y continuefor dia in diasSemana {
if dia == "Jueves" {
print("¡Encontré el jueves!")
break // Para todo el bucle aquí
} else {
print("\(dia) no es jueves")
}
}
break → Para el bucle completamente. Sale de él.continue → Salta al siguiente ciclo sin ejecutar e