Guard Let — ساختار زبان Swift است که برای خروج زودهنگام از تابع در صورت نبود مقدار در Optional طراحی شده است. برخلاف if let، guard let یک متغیر unwrapped در همان محدوده دید تابع اصلی ایجاد میکند و خروج اجباری از آن را از طریق return، break یا throw الزامی میکند. به گزارش Swift.org، 2026، guard روش ترجیحی برای کاهش تو در تویی هنگام پردازش Optional است.
نکات کلیدی
Guard Let ساختاری در Swift است که Optional را از نظر وجود مقدار بررسی میکند. اگر مقدار وجود داشته باشد (Optional.some)، استخراج (unwrapped) شده و در بقیه تابع قابل دسترس میشود. اگر مقدار وجود نداشته باشد (Optional.none)، بلوک else اجرا میشود که باید جریان کنترل فعلی را خاتمه دهد.
ویژگی کلیدی guard let — محدوده دید متغیر unwrapped است. برخلاف if let که متغیر فقط داخل آکولادها قابل دسترس است، guard let متغیر را در همان سطح خود ساختار ایجاد میکند. این امکان استفاده از آن را پس از بلوک guard، بدون تو در تویی فراهم میکند.
Guard جایگزین if let نیست، بلکه ابزاری اضافی برای سناریوهایی است که nil به معنای «نمیتوان ادامه داد» است. این رویکرد با اصل early return (بازگشت زودهنگام) مطابقت دارد که با حذف شاخههای else تو در تو، کد را خواناتر میکند.
در جامعه Swift، guard let به استاندارد واقعی برای پردازش Optional در اکثر پروژههای iOS تبدیل شده است. تحلیل مخازن متنباز نشان میدهد که guard let 3-4 برابر بیشتر از if let برای استخراج مقادیر اختیاری در کد تولیدی استفاده میشود، زیرا به وضوح پیششرط را نشان میدهد و بار شناختی هنگام خواندن را کاهش میدهد.
هنگام کار با زنجیرههای اختیاری، guard let را میتوان با بررسیهای اضافی ترکیب کرد. به عنوان مثال، guard let data = networkResult, data.count > 0 else { return } هم وجود و هم اعتبار دادهها را بررسی میکند. letهای متعدد در یک guard تعداد خطوط را کاهش میدهد و پیششرطها را بدون ساختارهای تو در تو خواناتر میکند.
انتخاب بین guard let و if let به هدف بستگی دارد: if let زمانی استفاده میشود که هر دو مسیر (مقدار وجود دارد / مقدار وجود ندارد) اجرا را ادامه میدهند. guard let — زمانی که نبود مقدار به معنای خروج زودهنگام است.
از if let زمانی استفاده کنید که نیاز به انجام عمل فقط در صورت وجود مقدار دارید، و در صورت nil کار دیگری انجام داده و ادامه دهید. if let یک محدوده دید موقت ایجاد میکند و متغیر فقط در داخل بلوک وجود دارد.
guard let برای اعتبارسنجی دادههای ورودی استفاده میشود. اگر یکی از پیششرطها برآورده نشود (Optional برابر nil است) — تابع با خطا خاتمه مییابد. این کار کد را مسطح میکند: ابتدا بررسیها، سپس منطق اصلی بدون تو در تویی.
func processUser(id: String?) {
// Guard — خروج زودهنگام هنگام nil
guard let userId = id else {
print("شناسه کاربر وجود ندارد")
return
}
// userId اینجا در دسترس است — بدون تو در تویی
fetchProfile(userId: userId)
}
func formatAddress(address: String?) {
// If let — پردازش و ادامه
if let valid = address, valid.count > 5 {
displayAddress(valid)
} else {
showPlaceholder()
}
// بدون متغیر unwrapped ادامه میدهیم
}
Swift guard تنها به Optional binding محدود نمیشود. ساختار guard میتواند شرایط Boolean دلخواه را بررسی کرده و چندین بررسی را در یک بلوک ترکیب کند.
فرم guard شرط else عبارت Boolean را بررسی میکند. اگر شرط نادرست باشد — بلوک else اجرا میشود. این برای اعتبارسنجی پیششرطها مناسب است: بررسی محدوده، وضعیت یا مجوزهای دسترسی.
Guard اجازه میدهد چندین let-binding و شرایط Boolean را در یک خط با کاما ترکیب کنید. همه بررسیها به صورت ترتیبی انجام میشوند؛ در اولین false یا nil، بلوک else اجرا میشود. این تعداد بلوکهای guard تو در تو را کاهش میدهد.
func updateProfile(
name: String?,
age: Int?,
email: String?
) {
// Guardهای متعدد در یک خط
guard let userName = name,
let userAge = age,
let userEmail = email,
userAge >= 18
else {
print("دادههای نامعتبر پروفایل")
return
}
saveProfile(
name: userName,
age: userAge,
email: userEmail
)
}
Guard Let به طور محکمی وارد تمرین روزمره توسعهدهندگان iOS به عنوان روش استاندارد برای استخراج ایمن مقادیر اختیاری با خروج زودهنگام و حداقلسازی تو در تویی کد شده است.
در پروژههای واقعی iOS، guard Let به طور گسترده استفاده میشود — از delegateها تا تجزیه JSON. بیایید سناریوهای معمول کاربرد در توسعه موبایل را بررسی کنیم.
الگوی معمول Cocoa Touch: بررسی اینکه آیا delegate تنظیم شده است و فراخوانی متد آن. Guard let از if let تو در تو جلوگیری میکند.
هنگام تجزیه دستی دیکشنری [String: Any]، guard let به صورت ترتیبی مقادیر را با بررسی نوع استخراج میکند. اگر فیلد وجود نداشته باشد یا نوع مطابقت نداشته باشد — تابع با nil خاتمه مییابد.
Failable initializer (init?) از guard let برای بررسی پارامترها و بازگشت nil در صورت دادههای نامعتبر استفاده میکند.
protocol DataProviderDelegate: AnyObject {
func didReceiveData(_ data: Data)
}
class DataLoader {
weak var delegate: DataProviderDelegate?
func loadData() {
guard let del = delegate else {
return // delegate وجود ندارد — خارج میشویم
}
let data = fetchDataFromNetwork()
del.didReceiveData(data)
}
}
// Failable initializer با guard let
struct Config {
let apiURL: URL
let timeout: TimeInterval
init?(dictionary: [String: Any]) {
guard let urlString = dictionary["api_url"] as? String,
let url = URL(string: urlString),
let t = dictionary["timeout"] as? TimeInterval
else {
return nil
}
self.apiURL = url
self.timeout = t
}
}
در همه مثالها، guard let یک ایده را نشان میدهد: استخراج ایمن با خروج زودهنگام هنگام nil. این به ویژه هنگام کار با UIKit ارزشمند است، جایی که بسیاری از ویژگیها (tableView.dequeueReusableCell، storyboard instantiate) Optional برمیگردانند. Guard let جایگزین force unwrap بدون خطر crash میشود و خوانایی را با تراکم بالای بررسیها در یک متد حفظ میکند.
توسعهدهندگان باتجربه Swift الگوهای پایداری برای استفاده از guard let ایجاد کردهاند که کد را قابل پیشبینی و خودمستندساز میکند.
Guard let ساختار سادهای است، اما استفاده نادرست از آن منجر به اشتباهات سختیاب میشود. بیایید رایجترین مشکلات را بررسی کنیم.
سوالات متداول
Guard let یک متغیر unwrapped در همان محدوده دید تابع ایجاد میکند و خروج اجباری از بلوک else را الزامی میکند. If let متغیر را فقط داخل بلوک خود ایجاد میکند. Guard تو در تویی را کاهش میدهد، if let هر دو سناریو را پردازش میکند.
بله، guard میتواند یک شرط Boolean دلخواه را بررسی کند: guard condition else { return }. این برای اعتبارسنجی پیششرطها استفاده میشود: بررسی ایندکس، مجوزهای دسترسی یا وضعیت قبل از اجرا.
Force unwrap (!) در صورت nil بودن Optional، خطای runtime پرتاب میکند. این برنامه را ناپایدار میکند. Guard let nil را با خروج صریح ایمن پردازش میکند، از crash جلوگیری میکند و خوانایی را حفظ میکند.
در Kotlin معادل مستقیمی برای guard let وجود ندارد. نزدیکترین ساختارها: ?: return (الویس با خروج زودهنگام) و requireNotNull() برای پرتاب استثنا در صورت null. Kotlin به smart cast پس از بررسی ترجیح میدهد.
Guard let با هر Optional از جمله نتیجه زنجیره اختیاری کار میکند: guard let value = object?.property?.method() else { return }. اگر هر حلقهای nil باشد — بلوک else اجرا میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید