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:
-
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ę. Jeinil, vykdomaselseblokas (dažniausiai išeiti iš scope). Jei sėkmingai išgauta, ji prieinama poguardšiame scope.func processString(_ optionalString: String?) { guard let unwrappedString = optionalString else { return // Išeiti iš funkcijos } // unwrappedString turi `String` tipą ir yra prieinama čia }
-
Opcionalų grandinėjimas (
?): leidžia kviesti savybes, metodus ir indeksus opcionalui. Jei opcionalasnilbet kuriame grandinės taške, visa grandinė nutraukiama, ir rezultatas yraniltipas.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ą -
Priverstinis išpakavimas (
!): nesaugus reikšmės išgavimas. Sukelia klaidą vykdymo metu (crash), jei opcionalasnil. Reikėtų naudoti labai atsargiai, tik žinant, kad opcionalas nėranil.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ą -
Nulinės susiejimo operatorius (
??): teikia numatytą reikšmę, jei opcionalasnil.let optionalValue: Int? = nil let definiteValue = optionalValue ?? 0 // definiteValue bus 0 -
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ėnilprieigos 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.