Guard Let: مبانی، نحو و کاربرد در Swift

نویسنده: IT Sectr منتشر شده: 2026-05-26 زمان مطالعه: 8 دقیقه

Guard Let — ساختار زبان Swift است که برای خروج زودهنگام از تابع در صورت نبود مقدار در Optional طراحی شده است. برخلاف if let، guard let یک متغیر unwrapped در همان محدوده دید تابع اصلی ایجاد می‌کند و خروج اجباری از آن را از طریق return، break یا throw الزامی می‌کند. به گزارش Swift.org، 2026، guard روش ترجیحی برای کاهش تو در تویی هنگام پردازش Optional است.

نکات کلیدی

  • Guard Let — ساختار Swift برای خروج زودهنگام از تابع هنگام nil در Optional.
  • متغیر Unwrapped پس از guard let در کل تابع باقی‌مانده قابل دسترس است، نه فقط در داخل بلوک.
  • خروج اجباری — guard در بلوک else به return، break، continue یا throw نیاز دارد، در غیر این صورت کد کامپایل نمی‌شود.
  • کاهش تو در تویی — guard let جایگزین هرم‌های تو در توی if let می‌شود و جریان اصلی اجرا را مسطح می‌کند.
  • بررسی شرایط — guard (بدون let) می‌تواند شرایط Boolean دلخواه را بررسی کند، نه فقط Optional را.

Guard Let چیست؟

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: چه زمانی از کدام استفاده کنیم

انتخاب بین guard let و if let به هدف بستگی دارد: if let زمانی استفاده می‌شود که هر دو مسیر (مقدار وجود دارد / مقدار وجود ندارد) اجرا را ادامه می‌دهند. guard let — زمانی که نبود مقدار به معنای خروج زودهنگام است.

If let: پردازش Optional در یکی از دو مسیر

از if let زمانی استفاده کنید که نیاز به انجام عمل فقط در صورت وجود مقدار دارید، و در صورت nil کار دیگری انجام داده و ادامه دهید. if let یک محدوده دید موقت ایجاد می‌کند و متغیر فقط در داخل بلوک وجود دارد.

Guard let: بررسی پیش‌شرط‌ها

guard let برای اعتبارسنجی داده‌های ورودی استفاده می‌شود. اگر یکی از پیش‌شرط‌ها برآورده نشود (Optional برابر nil است) — تابع با خطا خاتمه می‌یابد. این کار کد را مسطح می‌کند: ابتدا بررسی‌ها، سپس منطق اصلی بدون تو در تویی.

swift
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 ادامه می‌دهیم
}

Guard با شرایط Boolean و بررسی‌های چندگانه

Swift guard تنها به Optional binding محدود نمی‌شود. ساختار guard می‌تواند شرایط Boolean دلخواه را بررسی کرده و چندین بررسی را در یک بلوک ترکیب کند.

Guard با شرط

فرم guard شرط else عبارت Boolean را بررسی می‌کند. اگر شرط نادرست باشد — بلوک else اجرا می‌شود. این برای اعتبارسنجی پیش‌شرط‌ها مناسب است: بررسی محدوده، وضعیت یا مجوزهای دسترسی.

letهای متعدد و شرایط

Guard اجازه می‌دهد چندین let-binding و شرایط Boolean را در یک خط با کاما ترکیب کنید. همه بررسی‌ها به صورت ترتیبی انجام می‌شوند؛ در اولین false یا nil، بلوک else اجرا می‌شود. این تعداد بلوک‌های guard تو در تو را کاهش می‌دهد.

swift
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: مثال‌های عملی

Guard Let به طور محکمی وارد تمرین روزمره توسعه‌دهندگان iOS به عنوان روش استاندارد برای استخراج ایمن مقادیر اختیاری با خروج زودهنگام و حداقل‌سازی تو در تویی کد شده است.

در پروژه‌های واقعی iOS، guard Let به طور گسترده استفاده می‌شود — از delegateها تا تجزیه JSON. بیایید سناریوهای معمول کاربرد در توسعه موبایل را بررسی کنیم.

بررسی delegate

الگوی معمول Cocoa Touch: بررسی اینکه آیا delegate تنظیم شده است و فراخوانی متد آن. Guard let از if let تو در تو جلوگیری می‌کند.

استخراج داده از JSON

هنگام تجزیه دستی دیکشنری [String: Any]، guard let به صورت ترتیبی مقادیر را با بررسی نوع استخراج می‌کند. اگر فیلد وجود نداشته باشد یا نوع مطابقت نداشته باشد — تابع با nil خاتمه می‌یابد.

سازنده با بررسی

Failable initializer (init?) از guard let برای بررسی پارامترها و بازگشت nil در صورت داده‌های نامعتبر استفاده می‌کند.

swift
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 می‌شود و خوانایی را با تراکم بالای بررسی‌ها در یک متد حفظ می‌کند.

الگوهای استفاده از Guard Let در Swift

توسعه‌دهندگان باتجربه Swift الگوهای پایداری برای استفاده از guard let ایجاد کرده‌اند که کد را قابل پیش‌بینی و خودمستندساز می‌کند.

  • اعتبارسنجی در ابتدای تابع — همه guard let‌ها در ابتدا قرار می‌گیرند و بخش پیش‌شرط‌ها را تشکیل می‌دهند. منطق اصلی پس از بررسی‌ها بدون تو در تویی می‌آید.
  • Guard + map — guard let با transform Optional از طریق map امکان استخراج و تبدیل مقدار را در یک مرحله فراهم می‌کند.
  • Guard در حلقه — داخل for-in، guard let عناصر nil را نادیده می‌گیرد و continue در بلوک else به تکرار بعدی می‌رود.
  • Guard با throw — در توابع throwing، guard let در صورت nil خطا پرتاب می‌کند که جریان تمیزی بدون شاخه‌های else با return nil می‌دهد.

اشتباهات رایج هنگام کار با Guard Let

Guard let ساختار ساده‌ای است، اما استفاده نادرست از آن منجر به اشتباهات سخت‌یاب می‌شود. بیایید رایج‌ترین مشکلات را بررسی کنیم.

  • return یا throw فراموش شده — کامپایلر Swift خروج اجباری از بلوک else را الزامی می‌کند. بدون return کد کامپایل نمی‌شود که ادامه تصادفی را غیرممکن می‌کند.
  • عوارض جانبی در else — بلوک else guard فقط برای خروج در نظر گرفته شده است. منطق پردازش خطا (ثبت، هشدار) باید قبل از return باشد.
  • Guard let در حلقه بدون continue — داخل حلقه guard باید با continue تمام شود، نه return، در غیر این صورت حلقه به طور کامل قطع می‌شود.
  • استفاده بیش از حد از guard — اگر شرط یک پیش‌شرط نیست (خطا یک سناریوی مورد انتظار است)، از if let استفاده کنید، نه guard. Guard به معنای «اگر nil — این یک باگ یا وضعیت استثنایی است».

سوالات متداول

تفاوت guard let با if let در Swift چیست؟

Guard let یک متغیر unwrapped در همان محدوده دید تابع ایجاد می‌کند و خروج اجباری از بلوک else را الزامی می‌کند. If let متغیر را فقط داخل بلوک خود ایجاد می‌کند. Guard تو در تویی را کاهش می‌دهد، if let هر دو سناریو را پردازش می‌کند.

آیا می‌توان از guard بدون let استفاده کرد؟

بله، guard می‌تواند یک شرط Boolean دلخواه را بررسی کند: guard condition else { return }. این برای اعتبارسنجی پیش‌شرط‌ها استفاده می‌شود: بررسی ایندکس، مجوزهای دسترسی یا وضعیت قبل از اجرا.

هنگام force unwrap Optional به جای guard let چه اتفاقی می‌افتد؟

Force unwrap (!) در صورت nil بودن Optional، خطای runtime پرتاب می‌کند. این برنامه را ناپایدار می‌کند. Guard let nil را با خروج صریح ایمن پردازش می‌کند، از crash جلوگیری می‌کند و خوانایی را حفظ می‌کند.

آیا معادلی برای guard let در Kotlin وجود دارد؟

در Kotlin معادل مستقیمی برای guard let وجود ندارد. نزدیک‌ترین ساختارها: ?: return (الویس با خروج زودهنگام) و requireNotNull() برای پرتاب استثنا در صورت null. Kotlin به smart cast پس از بررسی ترجیح می‌دهد.

چگونه از guard let با زنجیره‌های اختیاری استفاده کنیم؟

Guard let با هر Optional از جمله نتیجه زنجیره اختیاری کار می‌کند: guard let value = object?.property?.method() else { return }. اگر هر حلقه‌ای nil باشد — بلوک else اجرا می‌شود.

خلاصه

  • Guard let — ساختار Swift برای خروج زودهنگام هنگام nil در Optional با دسترسی به متغیر unwrapped در سطح تابع.
  • برخلاف if let، guard let خروج اجباری (return، throw، break) را در بلوک else الزامی می‌کند و کد را بدون تو در تویی مسطح می‌کند.
  • بررسی‌های چندگانه در یک خط guard تعداد بلوک‌های تو در تو را کاهش داده و خوانایی پیش‌شرط‌ها را بهبود می‌بخشد.
  • Guard let یک الگوی استاندارد برای توسعه iOS است: بررسی delegate، تجزیه JSON، اعتبارسنجی پارامترها و failable initializer.
  • Guard بدون let شرایط Boolean را بررسی می‌کند که برای اعتبارسنجی محدوده‌ها، وضعیت‌ها و مجوزهای دسترسی مناسب است.
  • از force unwrap به جای guard let، عوارض جانبی در بلوک else و استفاده از guard برای سناریوهایی که nil رفتار مورد انتظار است خودداری کنید.

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

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید