یکی از ویژگی های سوئیفت که باعث میشود کد ها کمتر با خطا مواجه شوند Optional ها هستند، حالا قبل از این که بخواهیم با مفهوم Optional ها آشنا بشویم، باید با nil آشنا بشویم.
nil
به فقدان یک مقدار و value در متغیر میگویند، یعنی در واقع یک فضایه خالی. وجود یک مقدار nil
در برنامه میتواند باعث crush کردن و بسته شدن برنامه شما شود.
حالا بریم سراغ موضوع اصلی که Optional ها هستند.
optional در واقع یک نوع داده حساب میشوند و با علامت ?
تعریف میشوند، مثلا با داده هایی از نوع Int یا String آشنا شده ایم. حال Optional یعنی متغیری که شما تعریف میکنید ممکن است از یک نوع داده خاص باشد (مثلا Double) یا اصلا مقداری نداشته باشد و nil باشد.
?String
یعنی متغیری که شما تعریف میکنید ممکن است از نوع String باشد یا ممکن است nil باشد.?Int
یعنی متغیری که شما تعریف میکنید ممکن است از نوع Int باشد یا ممکن است nil باشد.حالا نحوه تعریف یک متغیر بصورت optional را در کد هم ببینیم:
var name: String?
print(name)
name = "Swift Programming Language"
print(name)
خروجی:
nil
optional("Swift Programming Language")
در بعضی مواقع ما نیاز داریم که متغیری که مثلا بصورت ?Int
تعریف شده را در متغیری از نوع Int
قرار دهیم، آیا چنین چیزی امکان دارد؟ به مثال زیر دقت کنید
let age: Int? = 25
var age2: Int
age2 = age //Error: Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
دو روش کلی برای unwrap کردن متغیر ها وجود دارد:
شاید یک مقدار برای شما گیج کننده بنظر بیاد، اما با کمی دقت میتوانید این تیکه کد پایین را درک کنید.
مفهوم این کد این است که اگر متغیر name وجود داشت و nil
نبود، آن را درون متغیر unwrapped قرار بده و وارد بلوک if
شو، در غیر این صورت وارد بلوک else
شو!
var name: String?
name = "Milad"
if let unwrappedName = name {
print("unwrapped var is: \(unwrappedName)")
} else {
print("var is nil")
}
به زبان خودمانی force unwrap کردن یک متغیر در سوئیفت به این معنا است که ما به سوئیفت این اطمینان رو میدهیم که حتما متغیر مد نظر ما پر شده و nil
نیست. برای force unwrap کردن متغیر کافی است در انتهای آن علامت !
قرار دهیم.
let price: Int? = 25
var price2: Int
price2 = price!
print(price2)
خروجی:
25