به نام خدا

شاید توی کار با سویفت انواع متغییر ها رو دیده باشید منظورم از انواع به معنی نوع متغییر که دابل و استرینگ باشه نیست

کد زیر یک متغییر استرینگ که دارای setter و getter  هست رو نشون میده

var name : String? {
        set {
            validationNameAndSave(newValue)
        }
        get {
            return getSavedName()
        }
    }

فکر میکنم کار کد بالا روشن هست

وقت متغییر name رو برابر مقدار جدیدی قرار میدید در حقیقت متعییر مقدارداده نمیشه بلکه مقدارش برای یه تابع ارسال میشه و اونجا تابع میتونه دخیره کنه یا هرکار دیگه ای و هرموقع هم مقدار متغییر رو بخواید متغییر مقدارش رو از تابع getSavedName میگیره و به شما میده یعنی عملا این یه متغییر معمولی نیست یعنی ممکنه توی یه خط مقدار بهش بدید و خط بعدیش مقداری که ازش میخونید با مقداری که خط بالا بهش داده باشید فرق داشته باشه

 

تعریف کردن متغییر های فقط خواندنی  ReadOnly

هر موقع که شما set اون متغییر رو حذف کنید متغییر شما فقط خواندنی میشه و دیگه نمیتونید بهش مقدار بدید

البته سویفت برای راحتی کار به شما این امکان رو داده که دیگه کلمه کلیدیget روهم ننویسید به این شکل

 var name : String? {
        return getSavedName()
    }

 

خب فکر میکنم شده باشه که یه وقتایی میخوایم یه مقداری رو وقتی یه بار یه متغییر صدا زده میشه همون موقع مقدار داده بشه و دفعات بعد از همون استفاده کنه

بزارید یه مثال بزنم مثلا فرض کنید که توکنی که قرار هست توی هر رکوئست روی هدر درخواستتون ست شده باشه رو میخواید از توی UserDefult بخونید و دفعات بعد دیگه به userDefult دست نزنید

اگه قبلا کار کرده باشید قطعا حل این مسئله براتون به این شکله که یه جا اول برنامه متغییری رو مقدار میدید و دفعات بعد ازش استفاده میکنید ولی خب میخواید این توکن رو استاتیک بزارید تا توی همه کلاس ها قابل دسترس باشه بازم همون راه جواب میده اما ممکنه یه بار قرار باشه اون کد اول برنامه اجرا نشه به هردلیل و همه جای برنامه توکن ما نال میشه

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

اما کار راحت تر توی سویفت اینه که متغییرتون رو میتونید شبیه به همین تابع تعریف کنید یعنی بار اول بدنه تابع اجرا میشه و دفعات دیگه مقدارش فقط برگشته میشه 

حالا چجوری میتونیم اینجور توابعی رو تعریف کنیم؟

var token : String? = {
       //Do Any This
        return foo;
    }()

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

فعلا تا همینجا بسه انشاءالله بعدا اموزش رو اپدیت میکنم