Sobes.tech
Junior

Care sunt modalitățile de tratare a optionalilor în Swift?

sobes.tech AI

Răspuns de la AI

  1. Dezambalare forțată:

    // Se folosește ! dacă e sigur că optionalul conține o valoare.
    let optionalValue: String? = "salut"
    let unwrappedValue = optionalValue! // Periculos, poate cauza crash dacă valoarea este nil
    
  2. Legarea opțională (if let, guard let):

    // if let - execută blocul de cod dacă optionalul nu este nil.
    if let value = optionalValue {
        print(value)
    }
    
    // guard let - folosit pentru a ieși devreme din funcție sau bloc dacă optionalul este nil.
    func processValue(_ value: String?) {
        guard let unwrappedValue = value else {
            print("Valoare nil")
            return
        }
        print(unwrappedValue)
    }
    
  3. Împâslire opțională:

    // Permite apelarea sigură a metodelor, proprietăților sau subscripturilor pe valori opționale.
    struct Company {
        var address: Address?
    }
    
    struct Address {
        var street: String?
    }
    
    let company: Company? = Company(address: Address(street: "Main Street"))
    let street = company?.address?.street // Rezultatul va fi un String opțional?
    
  4. Operatorul de coalescență nil (??):

    // Oferă o valoare implicită dacă optionalul este nil.
    let name: String? = nil
    let displayName = name ?? "Anonim" // Dacă name este nil, displayName va fi "Anonim"
    
  5. Optional implicite deconspirate:

    // Sunt detectate cu ! după tip. Compilatorul nu necesită deconspirare explicită, dar poate duce la crash dacă nil.
    let implicitlyUnwrappedString: String! = "aceasta este o șir"
    print(implicitlyUnwrappedString.count) // Nu necesită ! pentru acces la membri
    
  6. Utilizarea if case let cu potrivire de pattern-uri:

    // Metodă mai avansată pentru verificarea enumurilor cu valori asociate, inclusiv opționale.
    enum Result {
        case success(String)
        case failure
    }
    
    let result: Result? = .success("Operație finalizată")
    
    if case let .success(message)? = result {
        print("Succes cu mesaj: \(message)")
    }