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):
- Երբ փակագիծը օգտագործվում է որպես իրադարձության մշակող կամ դելեգատ։