Î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. |
Întrebări & Exemple de Cod:
Tipuri Non-Copiabile în Swift: ~Copyable, consuming și borrowingAi o nelămurire despre utilizarea comenzii
Tipuri Non-Copiabile în Swift: ~Copyable, consuming și borrowingsau 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.