- Ep 000
- presentación del canal
- Qué vamos a ver y qué no
- SwiftUI vs UIKit
- Objective C vs Swift
- Este repo como punto de encuentro
- issues
- Code of Conduct
- instalación de herramientas: Xcode
- cuenta developer en Apple, merece la pena?
- tipos de cuentas de desarrollador
- Las mejores prácticas
- Playgrounds Swift y el mínimo Swift imprescindible
- Código en Inglés
let / var
- Ep 001
- presentación del canal / Diego (que se me olvidó)
- Cosas que recomiendo: https://twitter.com/XcodeReleases
- Playgrounds Swift y el mínimo Swift imprescindible
class / struct
- structs: value types
- fluent API para "cambiar" un Struct
array
if
- funciones
- argumentos de funciones
- omitir
return
- clausuras
- argumentos en clausuras
$0
, etc.- trailing closures
- Hello World iOS!
- crear el proyecto
- ficheros, File Navigator ⌘+1
- código
- @main
- App protocol
- Simulador iOS: seleccionar el Sim
- ejecución y parada del proyecto
- Text
- Ep 002
- ℹ️ canal
- mil gracias por todos los follows y visualizaciones
- comentarios actualizados en Youtube
- respondo a las issues en Github
- shoutout Aitor Uranga for https://twitimer.com/
- Text
- Modifiers
foregroundColor
background
padding
font
fontWeight
shadow
cornerRadius
- Modifiers
- Color
- Attributes Inspector
⌥ + ⌘ + 4
- Label
- Texto + icono!
- SF Symbols, app SFSymbols
- Spacer
- Más de una View a la vez, ViewBuilders
- VStack
- ScrollView
- Image (local)
- 💻 Pantalla de Acerca de
- ℹ️ canal
- Ep 003
- Ep 004
- ℹ️ canal
- Añadir SwiftUI Views usando Library
- AsyncImage https://pokeapi.co/
.border(Color.red, width: 5)
- Crear vistas personalizadas
- 💻 Cargar imágenes a izquierda y derecha pulsando un botón
- usando un array de URLs (strings)
.frame(width: 320, height: 200, alignment: .center)
- cambiar background color de la vista
- Assets Catalogs: uso para colores
- HStack
- Separator
- Ep 005
- Clausuras en Swift: toma segunda
- argumentos en clausuras
$0
, etc.- trailing closures
- 💻 Mejorar Pokepedia Screen
- full screen
- Mejorar botón
- Imagen con tamaño adecuado
- añadir placeholder
- extraer modelo
- Clausuras en Swift: toma segunda
- Ep 006
- Ep 007
- Separar vista detalle Pokemons
- Añadir
PokemonDetailView
vacía - Añadir NavigationView
- Añadir
navigationTitle
a List - Añadir NavigationLink
- Ep 008
- JSON Decoding
- copiar JSON en Swift
- Decodable protocol
- keys
- debug problemas con JSON Decoding
- cambiar signatura función para usar clausuras
- JSON Decoding
- Ep 009
- finalizar propiedad URL mostrando la Imagen del Pokemon
- Networking
- depurar JSON
- Paw, generar código con Paw
- cURL + pbcopy + editor
- cURL + pretty print
- función para bajar los datos JSON de un Pokemon
- bucle para bajar unos cuantos
- multihilo y depuración
- @escaping
- depurar JSON
- Ep 010
- acabar colores con un enum
- volver al hilo principal
- cargar lista pokemons al principio
- Ep 011
- separar vista carga
- Unit Testing I
- crear target de testing
- escribir test para parse
- Unit Testing con XCFramework
- Ep 012
- añadir nuevos tests (JSON parsing)
- mover fichero JSON a target pruebas
- varios targets de tests
- tests lentos
- Schemas y targets: relación
- Ep 013
- mapas
- añadir vista mapa
- inyectar pokemons en mapa
- añadir anotaciones al mapa
- mostrar/ocultar una vista sobre el mapa
- efectos: blur y animación
- mapas
- Ep 014
- Test doubles: mocks, stubs
- Testing API
- Ep 015
- Final touches to the App
- Ep 016
- Sample Animations App: create the App (iOS, Mac Catalyst)
- Add a simple TabView
- Create RotatingBackgroundView
- BouncingImage with
repeatForever
animation
- Ep 017
- SpriteKit particle generator
- Ep 018
- Cómo definir la mínima versión soportada por nuestra App, cambiando el iOS Deployment Target.
- Animación 3D
- Efectos de partículas con SpriteKit
- Ep 019
- Ep 020
- Ep 021
-
añadir #if debug
-
usar nuestra nueva Page en API
-
Backlog
-
navigationBarItems
-
🛠 Xcode: Settings, Project, targets, Unit tests Target
-
NavigationLink
navegando programaticamente -
VStack
alignment
yspacing
-
.buttonStyle(.borderedProminent)
-
💻 programa que imprima tu nombre en un Label
-
Bindings, $ wrapper
- La diferencia es que el tipo que espera el TexField es Binding, para poder cambiarlo desde dentro del TextField. Si no pones el $ el error que tienes es: Cannot convert value 'number' of type 'String' to expected type 'Binding', use wrapper instead
Es decir, el $ es una manera “rápida”de crear un Binding Si no usas el $, tienes que escribir esto:
TextField("Your guess", text: Binding<String>(get: { return self.number }, set: { newValue in self.number = newValue }))
-
some
keyword -
Networking 2
- acceder a la red para bajar una imagen
-
crear un hosting estático en MongoDB Realm
- buscar una API y copiar el JSON
- hospedarlo de manera estática
- Ej: https://dog.ceo/api/breeds/list/all
- Ej: https://application-0-xbjwv.mongodbstitch.com/example.json
-
-
Controles
- TextEditor
- Stepper
- Toggle
- Picker
- Form
-
Xcode
- Navigators
- Panels
- Settings
- Debug area
- etc.
-
Ep Debugging avanzado
- Crear puntos de ruptura
- Activar, continuar, parar
- Puntos de ruptura que no paran
- Añadir acciones a los puntos de ruptura
-
Ep code signing
- bitcode
-
Ep maps
- GPS
- Pedir permisos
-
Ep SwiftUI Canvas
-
Sensores
- Cámara y permisos
- Acelerómetro
- 💻 App estaciones del año
-
Ep XX
- Testing
-
Ep XX
- Simulador, dónde se almacenan nuestros programas
- Inspeccionando nuestro programa
- binario
- bundle
- recursos
-
UIKit
- UIKit Dynamics
-
Ep XX
- DocC
-
Ep XX
- Compilando desde la línea de comandos: xcodebuild y swift
- Github Actions
- crear nuestra GH Action que compile un proyecto
- ejecutar test de unidad en una GH Action
-
Ep XX
- Incorporando librerías de terceros: SPM
-
Ep XX
- Creando nuestros propios paquetes con SPM!
- Local Packages