Deși Apple a lansat Objective-C acum peste trei decenii, Swift este astăzi standardul absolut pentru dezvoltarea nativă iOS. Compania a migrat majoritatea framework-urilor și a documentației oficiale către Swift, făcându-l limbajul principal pentru orice aplicație modernă. Pentru un dezvoltator care dorește să fie angajat, cunoașterea Swift nu este opțională, ci esențială, deoarece ecosistemul de joburi se concentrează exclusiv pe acest limbaj. În plus, Swift oferă performanțe superioare, siguranță tipurilor (type safety) și o sintaxă mult mai concisă, ceea ce accelerează ciclul de dezvoltare și reduce erorile de runtime. Ignorarea Swift în favoța Objective-C ar limita semnificativ oportunitățile tale profesionale în prezent.
Concepte cheie
- Safety prin design: Swift folosește tipuri opționale (
Optional) pentru a preveni crash-urile cauzate de pointeri nil, forțând dezvoltatorul să gestioneze explicit absența valorilor. - Protocol-Oriented Programming (POP): Spre deosebire de moștenirea clasică, POP pune accent pe protocoale (interfețe) și extensii, permițând o compoziție flexibilă a comportamentelor.
- Value Types vs Reference Types: Structurile (
struct) și enumerările (enum) sunt copiate la atribuire (value types), oferind performanță și predictibilitate, spre deosebire de clase (class). - Closure și Higher-Order Functions: Swift permite transmiterea de funcții ca parametri, facilitând scrierea de cod declarativ și concis prin metode precum
map,filterșireduce. - Interoperabilitatea: Swift poate importa direct cod Objective-C existent, permițând migrarea graduală a proiectelor legacy fără a rescrie totul de la zero.
- SwiftUI: Framework-ul modern de UI bazat pe declarative programming, care înlocuiește treptat UIKit pentru interfețele utilizatorului noi.
- Memory Management: Utilizează Automatic Reference Counting (ARC) pentru gestionarea memoriei, dar necesită atenție la referințele circulare.
Exemplu practic
Să presupunem că ai o listă de utilizatori și vrei să afișezi doar numele celor activați. În loc de bucle for, folosești funcții de ordin superior:
struct User {
let name: String
let isActive: Bool
}
let users = [
User(name: "Ana", isActive: true),
User(name: "Ion", isActive: false),
User(name: "Maria", isActive: true)
]
// Filtrăm și mapăm într-un singur pas
let activeNames = users
.filter { $0.isActive }
.map { $0.name }
print(activeNames) // Ieșire: ["Ana", "Maria"]
Acest model este preferat în industrie pentru că este mai ușor de citit și de testat unitar decât buclele imperative tradiționale.
Greșeli frecvente
- Ignorarea Optionals: Accesarea directă a unei valori opționale cu
!(force unwrap) fără verificare prealabilă duce la crash-uri imediate dacă valoarea estenil. Folosește întotdeaunaif let,guard letsau operatorul coalescent??. - Confuzia între struct și class: Utilizarea claselor când ar fi suficientă o structură duce la probleme nedorite de mutabilitate și referințe partajate, complicând debugging-ul.
- Memory Leaks în Closures: Uitați de captura variabilelor în closure-uri (
[weak self]) poate crea referințe circulare între view controller și delegate, consumând memorie inutil.
Întrebări de interviu
1. Care este diferența dintre struct și class în Swift?
Clasele sunt reference types (partajate prin referință), suportă moștenirea și au ciclu de viață gestionat de ARC. Structurile sunt value types (copiate la atribuire), sunt thread-safe implicit și nu suportă moștenirea, fiind preferate pentru modele de date simple.
2. Ce este un Optional și cum îl解condezi (unwrap) în siguranță?
Este un tip care poate conține o valoare sau nil. Se desface în siguranță folosind if let sau guard let, care extrag valoarea doar dacă există, evitând crash-urile.
3. De ce este recomandat Protocol-Oriented Programming? Permite reutilizarea codului prin compoziție, nu moștenire. Este mai flexibil, mai ușor de testat și se aliniază mai bine cu principiile SOLID, în special Open/Closed.
Exercițiu
Creează o structură Task cu proprietățile title (String), isCompleted (Bool) și priority (Int). Implementează un array de task-uri și scrie o funcție care returnează doar task-urile incomplete, sortate după prioritate (descrescător). Folosește filter și sorted. Timp estimat: 45 minute.