Sobes.tech
Middle

дар бораи рӯйхати тасвир дар Swift гап зан.

sobes.tech AI

Ҷавоб аз AI

Дар Swift барои идора кардани ошкоро ёфтан ва нигоҳ доштани тағйирёбандаҳо дар зери назорати маҳкам, истифодаи рӯйхати захиравии (capture list) мебошад. Ин кӯмак мекунад, ки гирдоби қавӣ (strong reference cycles) пешгирӣ карда шаванд, махсусан дар ҳолате, ки бо self дар дохили зери назоратҳои истифода мешаванд, ки дар синфҳо истифода мешаванд. Намудҳои асосии захиравӣ: weak ва unowned.

Навъи захиравӣ Тавсиф Вақте истифода бурдан мумкин аст
weak Тағйирёбандаро ҳамчун интихоб (optional) мегирад, наметавонад шуморо афзоиш диҳад. Қимати он метавонад nil шавад. Вақте, ки объекти зери назорат метавонад аз объекте, ки он захиравӣ мекунад, гузарад.
unowned Тағйирёбандаро бе афзоиши шумораи ишораҳо мегирад, аммо фикр мешавад, ки объекте, ки захиравӣ мешавад, то ҳол зинда хоҳад монд, то ки зери назорат тамом шавад. Ин интихоб нест. Вақте, ки зери назорат ва объекте, ки захиравӣ мешавад, як вақт зиндагӣ мекунанд, ва объекте, ки захиравӣ мешавад, то анҷоми зери назорат nil намешавад.

Синтаксиси рӯйхати захиравӣ:

{ [capture list] (параметрҳо) -> навъ баргардонед in
    // код
}

Масалан, истифодаи 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
            self.value += 1
            print("Меъёри ҳозир \(self.value)")
        }
    }
}

Масалан, истифодаи 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` дар ин ҳолат зарур нест, зеро тугма то ҳол вуҷуд дорад, то ки ViewController вуҷуд дорад.
        // Аммо агар зери назорат метавонад аз ViewController гузарад, unowned метавонад мувофиқ бошад, агар мо боварӣ дошта бошем,
        // ки self нопадид намешавад.
        let action = { [unowned self] in
             self.view.backgroundColor = .blue
        }
        action()
    }
}

Мумкин аст, ки на танҳо self-ро, балки дигар тағйирёбандаҳоро, ки дар зери назорат дастрасанд, захира кард. Масалан, барои нигоҳ доштани қимати тағйирёбанда дар вақти эҷоди зери назорат:

func createIncrementer(initialValue: Int) -> () -> Int {
    var currentValue = initialValue
    return { [initialValue] in // Захира кардани initialValue бо қимат
        currentValue += 1
        print("Қимати ибтидоӣ буд \(initialValue)") // initialValue қимати худро нигоҳ медорад
        return currentValue
    }
}

let incrementer = createIncrementer(initialValue: 5)
print(incrementer()) // Натиҷа: Қимати ибтидоӣ буд 5, пас 6
print(incrementer()) // Натиҷа: Қимати ибтидоӣ буд 5, пас 7