A vista List presenta información nunha lista vertical de filas. Cada fila contén unha ou máis vistas contidas dentro dunha cela.
List() {
Text("Levantarme")
Text("Ducharme")
Text("Almorzar")
Text("Coller o bus para ir ao IES San Mamede")
Text("Pasar unha gran mañá aprendendo SwiftUI")
Text("Coller o bus para casa")
Text("Xogar á PS5")
}

Listas que inclúen múltiples compoñentes
List() {
HStack {
Image(systemName: "trash.circle.fill")
Text("Tirar o lixo")
}
HStack {
Image(systemName: "person.2.fill")
Text("Recoller aos nenos no cole")
}
HStack {
Image(systemName: "car.fill")
Text("Lavar o coche")
}
}

Separadores
É posible modificar a liña que separa cada elemento dunha lista:
.listRowSeparator(.hidden): Oculta a liña.listRowSeparatorTint(cor): Colorea a liña.listRowBackground(Image(imaxe)): Pon unha imaxe de fondo nun elemento nunha lista
List() {
Text("Levantarme")
.listRowSeparator(.hidden)
Text("Ducharme")
Text("Almorzar")
.listRowSeparatorTint(.blue)
Text("Coller o bus para ir ao IES San Mamede")
Text("Xogar á PS5")
.listRowBackground(Image("ps5").scaleEffect(0.07))
Text("Cear")
Text("Repasar PMDM")
.listRowSeparatorTint(.yellow)
Text("Deitarse")
}

Listas dinámicas
Unha lista considérase dinámica cando contén un conxunto de elementos que poden cambiar co tempo: Os elementos pódense engadir, editar e eliminar e a lista actualízase dinámicamente para reflectir eses cambios.
Identificable (protocolo)
Para admitir unha lista deste tipo, cada elemento de datos que se mostrará debe estar contido dentro dunha clase ou estrutura que se axuste ao protocolo Identificable.
- O protocolo
Identificablerequire que a instancia conteña unha propiedade chamada id - A propiedade chamada
idse pode utilizar para identificar de forma única cada elemento da lista. - A propiedade
idpode ser de calquera tipo que se axuste ao protocoloHashable, que inclúe os tiposString,IntouUUID. - Se usamos o tipo
UUIDna propiedadeid, o métodoUUID()pódese utilizar para xerar automaticamente un ID único para cada elemento da lista.
Así, o seguinte código implementa unha estrutura simple para un exemplo de lista de tarefas pendentes que se axusta ao protocolo Identificable.
Neste caso, o ID xérase automaticamente a través dunha chamada a UUID():
struct ListaTarefas: Identifiable {
var id = UUID()
var tarefa: String
var nomeImaxe: String
}
Empregar listas dinámicas
Para empregar unha List dinámica, temos que ter un array de elementos que siguen o protocolo Identificable, tal e como expliquei no anterior apartado. Unha vez que temos o array:
- Definimos unha
Listdos elementos do array (liña 24 da imaxe inferior) - Recorremos o array mediante a sentencia nome_variable in (no exemplo da imaxen, o nome_variable é
item. Vemos este paso na liña 25 da imaxe inferior - Por cada elemento nome_variable do array, debuxamos as vistas que desexemos e accedemos aos datos do elemento
nome_variable. Das liña 27 a 30, creamos unHStackco nome da tarefa e da imaxe.
Agora a lista xa non necesita unha vista para cada celda. No seu lugar, a lista itera a través do array de datos e reutiliza a mesma declaración HStack, simplemente conectando os datos apropiados para cada elemento do array.

import SwiftUI
struct ListaTarefas: Identifiable {
var id = UUID()
var tarefa: String
var nomeImaxe: String
}
struct ContentView: View {
@State var lista: [ListaTarefas] = [
ListaTarefas(tarefa: "Tirar o lixo", nomeImaxe: "trash.circle.fill"),
ListaTarefas(tarefa: "Recoller aos nenos", nomeImaxe: "person.2.fill"),
ListaTarefas(tarefa: "Lavar o coche", nomeImaxe: "car.fill")
]
var body: some View {
List(lista){
item in
HStack {
Image(systemName: item.nomeImaxe)
Text(item.tarefa)
}
}
}
}
ForEach – Contido estático e dinámico ao mesmo tempo
En situacións nas que o contido dinámico e estático debe mostrarse xuntos dentro dunha lista, a instrución ForEach pódese usar dentro do corpo da lista para iterar a través dos datos dinámicos á vez que se declaran entradas estáticas.
O seguinte exemplo inclúe un botón Toggle estático xunto cun bucle ForEach para o contido dinámico:

import SwiftUI
struct ListaTarefas: Identifiable {
var id = UUID()
var tarefa: String
var nomeImaxe: String
}
struct ContentView: View {
@State var lista: [ListaTarefas] = [
ListaTarefas(tarefa: "Tirar o lixo", nomeImaxe: "trash.circle.fill"),
ListaTarefas(tarefa: "Recoller aos nenos", nomeImaxe: "person.2.fill"),
ListaTarefas(tarefa: "Lavar o coche", nomeImaxe: "car.fill")
]
@State private var estadoBoton = true
var body: some View {
List {
Toggle(isOn: $estadoBoton) {
Text("Permitir notificacións")
}
ForEach(lista) { tarefa in
HStack {
Image(systemName: tarefa.nomeImaxe)
Text(tarefa.tarefa)
}
}
}
}
}
Seccións
Unha List pódese dividir en seccións, incluíndo encabezamentos (headers) e pés (footers):

import SwiftUI
struct ListaTarefas: Identifiable {
var id = UUID()
var tarefa: String
var nomeImaxe: String
}
struct ContentView: View {
@State var lista: [ListaTarefas] = [
ListaTarefas(tarefa: "Tirar o lixo", nomeImaxe: "trash.circle.fill"),
ListaTarefas(tarefa: "Recoller aos nenos", nomeImaxe: "person.2.fill"),
ListaTarefas(tarefa: "Lavar o coche", nomeImaxe: "car.fill")
]
@State private var estadoBoton = true
var body: some View {
List {
Section(header: Text("Axustes")){
Toggle(isOn: $estadoBoton) {
Text("Permitir notificacións")
}
}
Section(header: Text("Tarefas"), footer: Text("Non te esquezas de nada 🧐")){
ForEach(lista) { tarefa in
HStack {
Image(systemName: tarefa.nomeImaxe)
Text(tarefa.tarefa)
}
}
}
}
}
}
Listas refrescables
Os datos que se amosan nunha pantalla a miúdo cambian co tempo.
- O paradigma estándar dentro das aplicacións iOS é que o usuario realice un refresco cara abaixo para actualizar os datos mostrados.
- Durante o proceso de actualización, a aplicación normalmente mostrará un indicador de progreso xiratorio despois do cal se amosan os datos máis recentes.
Para facilitar isto, SwiftUl proporciona o modificador refreshable(). Cando se aplica a unha vista, un xesto de refresco cara abaixo nesa vista mostrará o indicador de progreso e executará o código no peche do modificador.
Por exemplo:

import SwiftUI
struct ListaTarefas: Identifiable {
var id = UUID()
var tarefa: String
var nomeImaxe: String
}
struct ContentView: View {
@State var lista: [ListaTarefas] = [
ListaTarefas(tarefa: "Tirar o lixo", nomeImaxe: "trash.circle.fill"),
ListaTarefas(tarefa: "Recoller aos nenos", nomeImaxe: "person.2.fill"),
ListaTarefas(tarefa: "Lavar o coche", nomeImaxe: "car.fill")
]
@State private var estadoBoton = true
var body: some View {
List {
Section(header: Text("Axustes")){
Toggle(isOn: $estadoBoton) {
Text("Permitir notificacións")
}
}
Section(header: Text("Tarefas"), footer: Text("Non te esquezas de nada 🧐")){
ForEach(lista) { tarefa in
HStack {
Image(systemName: tarefa.nomeImaxe)
Text(tarefa.tarefa)
}
}
}
}
.refreshable {
lista += [
ListaTarefas(tarefa: "Encargar a cea", nomeImaxe: "eurosign.circle.fill"),
ListaTarefas(tarefa: "Chamar a miña colega Lola Mento", nomeImaxe: "phone.fill"),
]
}
}
}