Cuando creamos componentes reutilizables de las vistas de SwiftUI podemos añadir la versatilidad que nos dan los inicializadores (inits) en los structs.
Los structs tienen su inicializador por defecto, pero podemos añadir todos los que deseemos.
En este ejemplo de una celda con varios parámetros:
struct RatingCell: View {
let day: String
let month: String
let title: String
let subtitle: String
let namespace: Namespace.ID
var body: some View {
HStack(alignment: .center, spacing: 20) {
VStack {
Text(day)
.fontStyle(.subtitle, bold: true)
Text(month)
.fontStyle(.headline, color: .gray)
}
VStack(alignment:.leading) {
Text(title)
//Resto de la implementación...
}
}
}
}Gracias a las extensiones podemos crear inits a los que pasar valores a los parámetros de una subsista.
extension RatingCell {
init(activity: Activity, namespace: Namespace.ID) {
day = activity.dayView
month = activity.monthView
title = activity.hintView
subtitle = activity.comments
self.namespace = namespace
}
init(daily: Daily, namespace: Namespace.ID) {
day = daily.dayView
month = daily.monthView
title = daily.instructions
subtitle = daily.details
self.namespace = namespace
}
}Ventajas:
- Tendremos una interfaz más fluida
- La vista conserva el inicializador por defecto
- La vista está desacoplada del modelo
struct ActivityRatingListView: View {
let activities: [Activity]
let selectedActivity: Activity?
let namespace: Namespace.ID
let cols: GridItem = [GridItem()]
var body: some View {
ScrollView {
LazyVGrid(columns: cols) {
ForEach(activities) { activity in
Button {
selectedActivity = activity
} label: {
RatingCell(activity: activity, namespace: namespace)
}
}
}
}
}
}¿Quieres recibir posts, cheatCodes, enlaces y katas en Swift para practicar?
Quincenalmente recibirás en tu correo electrónico la newsletter, solo hace falta tu correo electrónico.