Gestionarea Valorilor Nule în Swift (Optionals, if let & guard let) în Swift (iOS & macOS)

Învață cum garantează Swift siguranța memoriei prin tipul Optional, operatorul nil-coalescing ??, optional chaining și desfacerea sigură cu if let și guard let.

Sintaxă Swift
guard let val = opt else { return }

În limbajul Swift, nicio variabilă standard nu poate conține valoarea nil (echivalentul null din alte limbaje). Pentru a reprezenta situațiile legitime în care o valoare poate lipsi, Swift pune la dispoziție tipul special Optional (notat cu semnul întrebării ? după tip, ex: String?), care funcționează ca un container ce poate conține fie o valoare împachetată, fie nil.

Exemplu practic: guard let vs. if let vs. Nil-Coalescing
// 1. Declararea unui tip Optional
var emailUtilizator: String? = "ion.popescu@exemplu.ro"

// 2. Desfacere sigură cu guard let (Early Exit)
func trimiteNotificare(catre email: String?) {
    // Dacă email-ul este nil, executăm blocul else și părăsim funcția
    guard let emailValid = email, !emailValid.isEmpty else {
        print("Eroare: Adresa de email lipsește sau este invalidă.")
        return
    }
    // Aici 'emailValid' este de tip 'String' non-opțional și este accesibil în întreg corpul funcției
    print("Notificare expediată cu succes la: \(emailValid)")
}

// 3. Desfacere cu if let (domeniu de vizibilitate limitat la bloc)
if let email = emailUtilizator {
    print("Email găsit: \(email)")
} else {
    print("Utilizatorul nu a specificat o adresă.")
}

// 4. Operatorul Nil-Coalescing (??) pentru valoare fallback implicită
let destinatar = emailUtilizator ?? "noreply@dexblog.ro"
print("Adresă fallback: \(destinatar)")

// 5. Optional Chaining (?.) pentru accesare profundă în proprietăți opționale
struct Profil { var bio: String? }
struct Utilizator { var profil: Profil? }

let user: Utilizator? = Utilizator(profil: Profil(bio: "Dezvoltator pasionat de iOS."))
let lungimeBio = user?.profil?.bio?.count ?? 0
print("Lungime bio: \(lungimeBio) caractere")

De ce să eviți Force Unwrapping (operatorul !)

Utilizarea operatorului de desfacere forțată ! (force unwrap) indică compilatorului să ignore protecțiile și să extragă direct valoarea. Dacă variabila conține nil la rulare, aplicația va genera o excepție fatală (fatal error: unexpectedly found nil while unwrapping an Optional value) și se va închide instantaneu. În codul de producție modern, folosește exclusiv guard let, if let sau ??.