Closureها (Swift Closures)
«کلوزر (Closure)» یک بلوک کد قابل حمل است. یعنی رفتار را مثل شی می فرستی. همچنین، متغیرهای اطراف را «گرفتن (Capture)» می کند و نگه می دارد.
عبارت های Closure و نحو کوتاه
کلوزرها کد خودبسنده اند. می توانی آن ها را به تابع بدهی یا ذخیره کنی. با مقایسه گرها و نگاشت خیلی کاربردی هستند.
let nums = [3, 1, 2];
let sorted = nums.sorted { $0 < $1 };
let strings = sorted.map { "#\($0)" };
print(strings);
نکته: با $0 و $1 پارامترها کوتاه می شوند. «استنتاج نوع (Type Inference)» هم نوشتن را ساده می کند.
گرفتن مقدارها (Capturing Values)
کلوزر می تواند متغیر اطراف را نگه دارد و بعداً تغییر دهد. این کار یک شمارنده ساده می سازد.
func makeCounter() -> () -> Int {
var n = 0;
return {
n += 1;
return n;
};
}
let next = makeCounter();
print(next());
print(next());
هشدار: چون مقدار با مرجع نگه داشته می شود، تغییرات پایدار می مانند.
Trailing Closure؛ خوانایی بهتر
اگر آخرین پارامتر کلوزر باشد، می توانی بیرون پرانتز بیاوری. این شکل خواناتر است.
func repeatTimes(_ n: Int, _ work: () -> Void) {
for _ in 0..<n {
work();
}
}
repeatTimes(3) {
print("Hi");
}
نکته: وقتی بدنه کلوزر کوتاه است، Trailing Closure عالی می شود.
مسیر مطالعه مرتبط
برای الگوها و انشعاب ها، enumها و الگوها را ببین. همین طور، برای مقدارهای خالی، اختیاری ها کمک کننده است. همچنین این صفحه «Closureهای سوئیفت» مرجع سریع توست.
تمرین های مرحله ای Closureهای سوئیفت
- یک آرایه را با کلوزر مرتب کن.
- با
mapآن را به رشته تبدیل کن. - یک شمارنده با
makeCounterبساز و تست کن. - یک تابع با Trailing Closure طراحی کن.
نکته: نام پارامترها را کوتاه کن؛ اما خوانایی را حفظ کن.
جمع بندی سریع
- Closure رفتار را جابه جا می کند.
- با
$0و استنتاج، کد کوتاه می شود. - Capture مقدارها را نگه می دارد.
- Trailing Closure خوانایی را بالا می برد.