Sobes.tech
Middle

Kako se u Swift-u implementira otvaranje (opcionalni, ugovori i drugi mehanizmi)?

sobes.tech АИ

Одговор од АИ

Опционали у Swift представљају тип који може садржати или вредност типа T (обавијена вредност), или nil, што означава одсуство вредности.

Основни механизми за рад са опционалима:

  1. Обједињавање опционала (if let, guard let): Безбедно извлачење вредности из опционала.

    • if let: Извлачи вредност и додељује је привременој константи или променљивој, ако опционал садржи вредност. Код се извршава само у овом случају.
      let optionalString: String? = "Hello"
      if let unwrappedString = optionalString {
          // unwrappedString има тип String
      }
      
    • guard let: Извлачи вредност. Ако је опционал nil, извршава се блок else (обично за излаз из тренутног scope-а). Ако је вредност успешно извучена, доступна је после guard у тренутном scope-у.
      func processString(_ optionalString: String?) {
          guard let unwrappedString = optionalString else {
              return // Излаз из функције
          }
          // unwrappedString типа String је доступан овде
      }
      
  2. Лансирање опционала (?): Омогућава позивање својстава, метода и индекса на опционалу. Ако је опционал nil у било којој тачки ланца, цела ланац се прекида, а резултат има тип опционала који садржи nil.

    class Person {
        var job: Job?
    }
    
    class Job {
        var salary: Double?
    }
    
    let person: Person? = Person()
    person?.job = Job()
    let salary = person?.job?.salary // salary има тип Double?
    
  3. Принудно разпакивање (!): Небезбедно извлачење вредности. Доводи до грешке у току извршавања (crash), ако опционал садржи nil. Треба користити са великом пажњом, само када је сигурно да опционал није nil.

    let requiredString: String! = "Must be present" // Нејасно извлачење опционала
    let unwrappedString = requiredString! // Принудно разпакивање
    
    let dangerousOptional: String? = nil
    // let crash = dangerousOptional! // Довешће до грешке
    
  4. Оператор нулевог сједињења (??): Обезбеђује подразумевану вредност ако је опционал nil.

    let optionalValue: Int? = nil
    let definiteValue = optionalValue ?? 0 // definiteValue ће бити 0
    
  5. Имплицитно разпакирани опционали (!): Опционали који се аутоматски разпакивају при коришћењу. Објављују се помоћу !. Треба их користити када је загарантовано да ће вредност бити додељена пре прве употребе, али не и при иницијализацији (нпр. IBOutlets). Ако је вредност nil при приступу, долази до грешке у току извршавања.

    var button: UIButton! // Предпоставља се да ће бити иницијализован у viewDidLoad
    // button.setTitle("Tap me", for: .normal) // Аутоматско разпакивање при коришћењу
    

"Контракти" у овом контексту нису посебан механизам језика Swift, слично као и у другим језицима. Swift обезбеђује безбедност кроз систем типова, укључујући опционале и контролу приступа, што помаже да се јасно изразе намјере и избегну грешке. Опционали служе као "контракт", указујући на могућност одсуства вредности.