Sobes.tech
Junior — Middle

Чӣ гуна пӯшида бо намунаи сохтор дар забони барномасозӣ ҳамкорӣ мекунад?

sobes.tech AI

Ҷавоб аз AI

В Swift, құрылымдар — бұл мән түрлері, яғни оларды беру немесе тағайындау кезінде нұсқаның көшірмесі жасалады. Жабықтар, сыртқы контексттен айнымалыларды ұстап алса да, олар мәндердің көшірмелерін ұстап алады, өздерін емес.

Егер жабық құрылымның қасиетін ұстап алса, ол оның ағымдағы мәнін ұстап қалады, түпнұсқаға сілтеме емес. Сондықтан, жабық ішіндегі өзгерістер құрылымның бастапқы нұсқасына әсер етпейді, егер ол @escaping ретінде белгіленбеген және inout параметрлерімен немесе сілтемелермен жұмыс істемесе.

Мысал:

struct Counter {
    var count = 0
    mutating func incrementer() -> () -> Void {
        return { [self] in
            print("Count is \(count)")
        }
    }
}

var counter = Counter()
let closure = counter.incrementer()
counter.count = 10
closure() // "Count is 0" деп шығарады, себебі жабық self көшірмесін ұстап қалды

Жабық құрылымның жағдайын өзгерте алу үшін, inout қолдану немесе кластармен (сілтеме түрлерімен) жұмыс істеу керек.