Sobes.tech
Middle

Ներկայացրեք բացատրություն escaping և non-escaping closures-ի տարբերության մասին և որ դեպքերում անհրաժեշտ է օգտագործել @escaping։

sobes.tech AI

Պատասխան AI-ից

Նախնական փակագծերը չեն արտասահմանի։

Չարտասահմանի փակագիծ:

  • Կատարվում է այն ֆունկցիայի մարմնում, որի մեջ է փոխանցվում:
  • Կապում է փոփոխականները, բայց ազատում է դրանք ֆունկցիայի ավարտից հետո:
  • Չպահպանում է ֆունկցիան:
func doSomething(completion: () -> Void) {
    // completion- ի կանչը այստեղ
    completion() 
}

Արտասահմանի փակագիծ:

  • Կատարվում է այն ժամանակ, երբ փոխանցված ֆունկցիան վերադառնում է:
  • Կապվում է ֆունկցիայի մարմնին:
  • Կարող է պահվել հետագա կատարման համար, օրինակ՝ այլ թելում կամ ասինխրոնում:
  • Կապում է փոփոխականները, պահելով ամուր հղումներ, ինչը կարող է հանգեցնել ամուր հղումների ցիկլերի (retain cycles):
  • Պահանջվում է բացահայտ @escaping հայտարարություն:
class DataManager {
    var completionHandlers: [() -> Void] = []

    func addCompletionHandler(handler: @escaping () -> Void) {
        completionHandlers.append(handler)
    }

    func performTasks() {
        // Կատարում է առաջադրանքները...
        for handler in completionHandlers {
            handler() // Հետագայում կանչել
        }
    }
}

@escaping-ի օգտագործումը անհրաժեշտ է հետևյալ դեպքերում:

  • Երբ փակագիծը պահվում է դասի կամ կառուցվածքի հատկության մեջ:
  • Երբ փակագիծը փոխանցվում է այլ թել կամ ասինխրոն գործողության (օրինակ՝ ցանցային հարցում, GCD, OperationQueue):
  • Երբ փակագիծը օգտագործվում է որպես իրադարձության մշակող կամ դելեգատ։