Tipuri Non-Copiabile în Swift: ~Copyable, consuming și borrowing în Swift (iOS & macOS)

Ghid complet pentru modelul de posesiune (Ownership) din Swift 5.9 și 6.0: tipuri non-copiabile (~Copyable / Move-only), transferul de posesiune cu consuming, împrumutul cu borrowing și deinițializatori deinit pe structuri.

Sintaxă Swift
struct FileDescriptor: ~Copyable { consuming func close() }

În mod tradițional, toate tipurile structurate din Swift erau liber copiabile în memorie (conformare implicită la protocolul Copyable). Totuși, în programarea de sistem există resurse care nu trebuie niciodată duplicate: descriptori de fișiere (file descriptors), conexiuni unice de baze de date, alocări de memorie GPU sau blocaje mutex de nivel scăzut.

Swift 5.9 și Swift 6 introduc Tipurile Non-Copiabile (Noncopyable Types sau Move-only Types), declarate prin suprimarea protocolului de copiere folosind sintaxa ~Copyable.

Definirea și Utilizarea unei Structuri Non-Copiabile
import Darwin

// Structură non-copiabilă ce gestionează o resursă fizică a sistemului de operare:
struct FileHandle: ~Copyable {
    private let fd: Int32

    init?(cale: String) {
        let descriptor = open(cale, O_RDONLY)
        guard descriptor >= 0 else { return nil }
        self.fd = descriptor
    }

    // Împrumut (borrowing): funcția citește date fără a prelua posesiunea resursei:
    borrowing func citesteOcteti() -> Int {
        var buffer = [UInt8](repeating: 0, count: 1024)
        return read(fd, &buffer, buffer.count)
    }

    // Consumare (consuming): funcția preia posesiunea definitivă; resursa nu mai poate fi folosită după apel!
    consuming func inchideFisier() {
        close(fd)
        // Nu mai este necesar să apelăm deinit
        discard self
    }

    // Spre deosebire de structurile normale, cele ~Copyable POT defini deinit!
    deinit {
        close(fd)
        print("Descriptorul de fișier a fost închis automat și curat.")
    }
}

// Utilizarea în cod:
func proceseazaFisier() {
    guard let fisier = FileHandle(cale: "/etc/hosts") else { return }
    
    // Apel borrowing permis:
    let bytes = fisier.citesteOcteti()
    print("Octeți citiți: \(bytes)")
    
    // fisier.inchideFisier() -> transferă posesiunea definitivă
    // O încercare de a folosi 'fisier' după această linie generează eroare de compilare imediată!
}

Modificatorii de Posesiune (Ownership Modifiers)

Modificator Semnificație Semantică Impact asupra Resursei
borrowing Acces temporar read-only (împrumut). Nu afectează deținătorul original; nu permite mutații sau dealocare.
consuming Transfer complet de proprietate (Move semantics). Deținătorul inițial renunță la variabilă; nu mai poate fi accesată în scope-ul curent.
inout Acces exclusiv temporar cu drept de modificare. Permite modificarea resursei la locul ei, returnând-o deținătorului la final.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Tipuri Non-Copiabile în Swift: ~Copyable, consuming și borrowing

Ai o nelămurire despre utilizarea comenzii Tipuri Non-Copiabile în Swift: ~Copyable, consuming și borrowing sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.