به نام خدا.

شاید شما چندسال با سویفت کار کرده باشید اما این آموزش براتون چیزهای جدیدی داشته باشه پس تا انتهای مطلب با ما همراه باشید

حتما تا به الان از Closure ها در زبان سویفت استفاده کردید کلاژر ها که توی زبان های دیگه لاندا بهشون میگن همون توابعی هستن که اسم ندارن و داخل متغییر ریخته میشن.

کلاژر ها قابل پاس داده شدن به داخل توابع هستن و به شکل زیر تعریف میشن.

{ (params) -> returnType in
statements
}

و البته که باید داخل متغیر بریزید یا مستقیما به داخل یه تابع پاس بدید.

توابع برای دریافت کلاژر (یا هرنوع کد دیگه) باید ورودی به این شکل داشته باشند:

func myFunc (code : () -> Void)  {
      
    }

تابع بالا داره یه آرگومانی رو میگیره که از نوع کلاژر هست و () نشون میده که قرار نیست چیزی برای ورودی این کلاژر بفرستید البته که Void هم نشون میده که کلاژر براتون چیزی برنمیگردونه

برای اجرای کد کلاژر هم کافیه که داخل تابع از code() استفاده کنید

توضیح زیادتر نمیدم چون بلدید

این پارامتر ورودی هم میتونه مثل سایر پارامتر ها آپشنال باشه که با یه علامت سوال اینکار رو میکنید

تابع را به تابع پاس بده

نکته خیلی جالب اینه که هرجایی که تابع شما داره یه کلاژر میگیره و یه ورودی و خروجی مشخصی هم براش تعریف شده، شما میتونید وقتی دارید تابع رو صدا میزنید بهش اسم یه تابع بدید که ورودی و خروجیش شبیه همون کلاژر باشه 

شاید یکم باورش سخت باشه اما میشه

func myFunc (compaireCode : (Int,Int) -> Bool)  {
        if compaireCode(2,3) {
//           statements
        }
    }
    
    func compaire (a : Int,b : Int) -> Bool {
        return a == b
    }

    myFunc(compaire)

 

عملگر ها در سویفت تابع هستند:

همه عملگرها در زبان سویفت یه تابع هستن که بنده هم یه آموزش مفصل راجع به عملگرها در سویفت روی سایت الفبا قرار دادم از اینجا میتونید ببینید

عملگر های میانی دارای دوتا ورودی (ویک خروجی) هستند مانند + که دارای دو ورودی left و right و یک خروجی از جنس مشخصی هست.

پس هرکجا که داخل تابعی نیاز به (Int,Int) -> Bool داشتید میتوانید عملگر را نیز پاس بدهید

مانند:

[122,3,5,6,345,234,3241].sorted(by: >)

 

AutoClosure مخصوص زمانی که پارامتری ورودی نمیگیرید:

فکر کنید که قراره تابعی بنویسید و کلاژری بگیرید که تنها خروجی داشته باشه و ورودی بهش ندید.

یه چنین تابعی رو فرض کنید

func animate(_ animation: @autoclosure @escaping () -> Void) {
    //statements
}

که میتونید اینجوری صدا بزنید:

animate(view.frame.origin.y = 100)