Sobes.tech
Middle

Kaip Swift įgyvendina atidarymą (pasirinktinai, sutartys ir kiti mechanizmai)?

sobes.tech AI

Atsakymas iš AI

Swift opcionalai yra tipas, kuris gali turėti arba T tipo reikšmę (apgaubtą reikšmę), arba nil, reiškiantį reikšmės nebuvimą.

Pagrindiniai mechanizmai dirbant su opcionalais:

  1. Opcionalų susiejimas (if let, guard let): saugus reikšmės išgavimas iš opcionalo.

    • if let: išgauna reikšmę ir priskiria ją laikinai konstanta ar kintamajam, jei opcionalas turi reikšmę. Kodas vykdomas tik šiuo atveju.
      let optionalString: String? = "Hello"
      if let unwrappedString = optionalString {
          // unwrappedString turi `String` tipą
      }
      
    • guard let: išgauna reikšmę. Jei nil, vykdomas else blokas (dažniausiai išeiti iš scope). Jei sėkmingai išgauta, ji prieinama po guard šiame scope.
      func processString(_ optionalString: String?) {
          guard let unwrappedString = optionalString else {
              return // Išeiti iš funkcijos
          }
          // unwrappedString turi `String` tipą ir yra prieinama čia
      }
      
  2. Opcionalų grandinėjimas (?): leidžia kviesti savybes, metodus ir indeksus opcionalui. Jei opcionalas nil bet kuriame grandinės taške, visa grandinė nutraukiama, ir rezultatas yra nil tipas.

    class Person {
        var job: Job?
    }
    
    class Job {
        var salary: Double?
    }
    
    let person: Person? = Person()
    person?.job = Job()
    let salary = person?.job?.salary // salary turi `Double?` tipą
    
  3. Priverstinis išpakavimas (!): nesaugus reikšmės išgavimas. Sukelia klaidą vykdymo metu (crash), jei opcionalas nil. Reikėtų naudoti labai atsargiai, tik žinant, kad opcionalas nėra nil.

    let requiredString: String! = "Must be present" // Implicitiškai išpakavamas opcionalas
    let unwrappedString = requiredString! // Priverstinis išpakavimas
    
    let dangerousOptional: String? = nil
    // let crash = dangerousOptional! // Sukels klaidą
    
  4. Nulinės susiejimo operatorius (??): teikia numatytą reikšmę, jei opcionalas nil.

    let optionalValue: Int? = nil
    let definiteValue = optionalValue ?? 0 // definiteValue bus 0
    
  5. Implicitiai išpakavami opcionalai (!): opcionalai, kurie automatiškai išpakavami naudojant. Deklaruojami su !. Reikėtų naudoti, kai garantuojama, kad reikšmė bus priskirta iki pirmojo naudojimo, bet ne būtina inicializacijos metu (pvz., IBOutlets). Jei reikšmė nil prieigos metu, įvyksta klaida vykdymo metu.

    var button: UIButton! // Tikimasi, kad bus inicializuotas viewDidLoad metu
    // button.setTitle("Tap me", for: .normal) // Automatinis išpakavimas naudojant
    

"Sutartys" šiame kontekste nėra atskiras Swift kalbos mechanizmas, panašus į sutartis kitose kalbose. Swift užtikrina saugumą naudodamas tipų sistemą, įskaitant opcionalus ir prieigos kontrolę, kas padeda aiškiai išreikšti ketinimus ir išvengti klaidų. Opcionalai veikia kaip "sutartis", nurodanti galimybę būti reikšmės nebuvimui.