به نام خدا

شاید اسمش رو شنیده باشید یا کسی از شما سوال کرده باشه یا حتی خودتون حین برنامه نویسی بهش برخورد کرده باشید؟

این اسم ها رو کجا شنیدید؟

وقتی که یه تابع به شکل زیر داشته باشیم:

func myEscapingFunction (code : (Int) -> Void) {
      
    }

که داخل پارامتر های ورودی تابع شما داره یه کد رو به صورت پارامتر میگیره (یعنی میخواید به تابعتون یه لاندا پاس بدید)

توی این حالت بحث escape و non-escape پیش میاد

اگه شما کدی که به عنوان پارامتر میگیرید توی تابع اجرا کنید و قبل اینکه تابع برگرده (return کنه) کد رو اجرا میکنید پس پارامتر شما از نوع non-escaping هست و لازم نیست هیچ علامتی توی ساختار تابعتون بزارید (چون به صورت پیشفرض از سویفت ۳ به بعد شما تمامی پارامتر هایی که به صورت لاندا پاس میدید در حالت non-escaping قرار داره)

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

حالا چه زمانی میگیم که کد ما فرار کرد؟ زمانی که کد قراره بعد از return شدن اجرا بشه مثلا وقتی یه تابعی قراره از API یه درخواستی رو بده و پاسخ برگردونه دیگه مجبورید که کد رو escape کنید یعنی تابع رو برگردونید ولی کد لاندایی که پاس داده شده رو توی یه متغییر خارج از تابع ذخیره کنید

یعنی اینجوری:

var myCode : ((Int) -> Void)?
    func myEscapingFunction (code : @escaping (Int) -> Void) {
      self.myCode = code
    }

توی این حالت حتما باید @escaping رو اونجایی که نوشتم قرار بدید مگرنه ایکس کد بهتون خطا میده و میگه که بذارید

خب اتفاقی که شاید به ذهن شما هم برسه اینه که وقتی یه پارامتر لاندای ورودی رو در حالت escape میزارید چون ذخیره میشه یه سری محدودیت ها برامون میاره

مثلا دیگه شما وقتی دارید این تابع رو صدا میکنید و بهش لاندا رو پاس میدید باید حواستون باشه که دیگه اگه میخواید از متغییر های کلاستون استفاده کنید باید از self. استفاده کنید و حتما هم یادتون باشه که weak self رو در اول کلاژرتون بزارید

  var myVar = true
    func callEscapingFunc () {
        myEscapingFunction {[weak self] a in
            var m = self?.myVar
        }
    }
    var myCode : ((Int) -> Void)?
    func myEscapingFunction (code :  @escaping (Int) -> Void) {
      myCode = code
    }

اما اگه از non-escaping دارید بهره میبرید (یعنی کد شما قبل از return تابعتون اجرا میشه و جایی ذخیره نمیشه)‌ دیگه نیازی به self. برای دسترسی به متغییر های کلاس ندارید چون مطمئن هستید که وجود دارند

الانم دانشگاه هستم باید برم سلف غذامو بگیرم ساعت ۱ هم امتحان ریاضی ۲ دارم :))

موفق باشید.

یاعلی