Swift init(), D'Una Vegada Per Totes

Guia completa sobre inicialitzadors a Swift: memberwise, designats, de conveniència, failable init, required, enum i més. Aprèn a usar-los correctament i evita errors.

sábado, 22 de marzo de 2025 • 2 min de lectura • Equip Q2BSTUDIO

Empresa-Software-Apps-Intel·ligenciaArtificial

Hola! El meu nom és Kiryl Famin, i sóc un desenvolupador iOS.

Avui vull analitzar en profunditat un tema aparentment simple: els inicialitzadors a Swift. Tot i la seva simplicitat aparent, la manca d'una comprensió completa del tema pot portar a errors frustrants que sovint es busquen solucionar ràpidament, sense entendre realment la causa.

En aquest article, cobrirem tot allò relacionat amb inicialitzadors, incloent:

  • Com mantenir l'inicialitzador membre d'una estructura mentre es defineix un de personalitzat
  • Per què no sempre és necessari definir un inicialitzador en classes
  • Per què cridar a super.init no sempre és obligatori en un inicialitzador designat
  • Per què tots els camps d'una subclasse han d'estar poblats abans de cridar a super.init
  • Com accedir a tots els inicialitzadors de la classe pare amb la menor quantitat de sobreescriptures possibles
  • Quan és realment necessari un inicialitzador required
  • Per què UIView.init() sempre es crida sense paràmetres, però init(frame:) i init(coder:) sí es sobreescriuen

A Q2BSTUDIO, som una empresa de desenvolupament i serveis tecnològics especialitzada en crear solucions a mida per a diverses plataformes. Ens apassiona compartir coneixements amb la comunitat i millorar contínuament l'experiència de desenvolupament amb tecnologies modernes com Swift.

Ara, avancem pas a pas per comprendre a fons aquest tema.

Resum en Català:

  • Tots els camps han d'estar poblats en un inicialitzador.
  • Les propietats var opcionals tenen un valor per defecte de nil.
  • Les estructures reben un inicialitzador membre automàticament.
  • L'inicialitzador membre desapareix quan es defineix un de personalitzat.
  • Un inicialitzador designat s'assegura que tots els camps siguin inicialitzats i crida a super.init().
  • Un inicialitzador de conveniència simplifica el procés cridant a un altre inicialitzador designat.
  • Els inicialitzadors de conveniència sempre criden a self.init, mentre que els designats criden a super.init.
  • Si una subclasse defineix noves propietats, perd els inicialitzadors de conveniència de la seva superclasse.
  • Per restaurar els inicialitzadors de conveniència d'una superclasse, cal sobreescriure tots els inicialitzadors designats.
  • Per minimitzar la quantitat de sobreescriptures, es poden usar inicialitzadors de conveniència sobreescrits.
  • Si una subclasse no introdueix nous paràmetres, hereta tots els inicialitzadors de la seva superclasse.
  • Si una superclasse només té init() sense paràmetres, aquest es crida automàticament a les subclasses.
  • Un inicialitzador required assegura que les subclasses l'implementin, útil en genèrics, protocols i crides a Self().
  • UIView.init() crida internament a init(frame:) o init(coder:).
  • Un inicialitzador fallable retorna un valor opcional.
  • Les enumeracions amb valors crus obtenen un inicialitzador init?(rawValue:) automàticament.
  • Tots els inicialitzadors en una enumeració han d'assignar un valor a self.

Esperem que aquest article t'hagi resultat útil. A Q2BSTUDIO creiem en l'excel·lència del desenvolupament i en compartir coneixements per ajudar altres desenvolupadors a millorar les seves habilitats cada dia.

UNA PAUSA?

Juga una estona abans de marxar

ELS NOSTRES SERVEIS

Com et podem ajudar

Tens un projecte en ment?

Explica'ns la teva visió i la convertim en una solució de programari. Sigui quin sigui l'abast, fem realitat la teva idea.