Sobes.tech
Junior

Šta će se desiti ako uklonimo opcionalne iz Swift-a?

sobes.tech АИ

Одговор од АИ

Ovo bi dovelo do značajnog smanjenja sigurnosti koda. Mnoge operacije bi postale potencijalno nesigurne, jer kompilator ne bi mogao garantovati prisustvo vrednosti.

  1. Uklanjanje opcionalnog lančanja (?) i forsiranog raspakivanja (!). Sintaksa za rad sa opcionalima bi postala nevažeća.
  2. Potrebni stalni provere nil. Programeri bi morali ručno da pišu uslove if za svaku operaciju sa potencijalno nedostajućom vrednošću, što bi znatno povećalo količinu ponovljivog koda i njegovu složenost.
  3. Povećan rizik od padova. Bez garancija kompilatora o prisustvu vrednosti, pokušaj pristupa nil bi doveo do greške u toku izvršavanja.
  4. Nedostatak elegantnih rešenja za asinhronost. Obrada rezultata asinhronih operacija koje mogu da ne uspeju (nil), postala bi komplikovana.
  5. Složenost rada sa API-jem Objective-C. Mnoge Objective-C metode vraćaju nil da bi ukazale na neuspeh ili odsustvo vrednosti. Interoperabilnost bi postala manje sigurna.

Primer koda pre i posle (hipotetički):

Pre:

var optionalString: String? = "Hello"
let length = optionalString?.count // Opcionalno lančanje

Posle (hipotetički):

var nonOptionalString: String // Sada sve promenljive moraju imati vrednost pri inicijalizaciji ili biti eksplicitno proverene
var potentiallyNilStringFromSomewhere: String

// Umesto opcionalnog lančanja, mora se pisati ovako:
if someFunctionCouldReturnNil() {
    // Obrada greške
} else {
    potentiallyNilStringFromSomewhere = ... // Dodeliti vrednost
    let length = potentiallyNilStringFromSomewhere.count // Potencijalni pad ako je vrednost zaista `nil`
}

// Ili tako, ako `nil` još uvek postoji u jeziku, ali bez podrške kompilatora:
if potentiallyNilStringFromSomewhere != nil {
    let length = potentiallyNilStringFromSomewhere!.count // Opasno forsko izvlačenje
} else {
    // Obrada `nil`
}

Na ovaj način, kod bi postao podložniji greškama u toku izvršavanja, manje čitljiv i teže održiv. Opcionalni su jedan od ključnih mehanizama Swift-a za obezbeđivanje tipne sigurnosti i sprečavanje Null Pointer Exception.