Middle
Pastāsti par capture sarakstu Swift.
sobes.tech AI
Atbilde no AI
Swift kalpo capture list tiek izmanto skaidri pārvaldībai ar izsekotām mainīgajām (closures). Tas palīdz izvairīties no spēcīgiem atsauces cikliem, īpaši, strādājot ar self iekļautajos slēdzienos, kas tiek izmantoti klasēs. Galvenie capture tipi: weak un unowned.
| Capture tips | Apraksts | Kad lietot |
|---|---|---|
weak |
Saglabā mainīgo kā opcionalu, nepārsniedzot atsauces skaitītāju. Tā vērtība var kļūt par nil. |
Kad objekts, ko iekļaujam, var pārlaist iekļauto objektu. |
unowned |
Saglabā mainīgo bez atsauces skaitītāja palielināšanas, bet pieņem, ka iekļautais objekts dzīvos tik ilgi, kamēr pastāv slēdzis. Nav opcionalais. | Kad slēdzis un iekļautais objekts ir ar vienādu dzīves ilgumu, un iekļautais objekts nebūs nil līdz slēdža beigām. |
Capture list sintakse:
{ [capture list] (parametri) -> atgriešanas tips in
// kods
}
Piemērs ar weak self:
class MyClass {
var value = 0
func doSomethingLater() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { [weak self] in
guard let self = self else { return } // `nil` pārbaude
self.value += 1
print("Vērtība tagad ir \(self.value)")
}
}
}
Piemērs ar unowned self:
class ViewController: UIViewController {
var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button = UIButton(type: .system)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
}
@objc func buttonTapped() {
// unowned self šajā gadījumā nav nepieciešams, jo poga pastāv tik ilgi, kamēr pastāv ViewController.
// Bet, ja slēdzis varētu pārlaist ViewController, tad `unowned` būtu piemērots, ja esam pārliecināti,
// ka self nebūs `nil`.
let action = { [unowned self] in
self.view.backgroundColor = .blue
}
action()
}
}
Var iekļaut ne tikai self, bet arī citas mainīgās, kas ir pieejamas slēdzienā. Piemēram, lai saglabātu mainīgās vērtību brīdī, kad tas tika izveidots:
func createIncrementer(initialValue: Int) -> () -> Int {
var currentValue = initialValue
return { [initialValue] in // Saglabājam initialValue pēc vērtības
currentValue += 1
print("Sākotnējā vērtība bija \(initialValue)") // initialValue saglabā savu vērtību
return currentValue
}
}
let incrementer = createIncrementer(initialValue: 5)
print(incrementer()) // Izvade: Sākotnējā vērtība bija 5, tad 6
print(incrementer()) // Izvade: Sākotnējā vērtība bija 5, tad 7