ViewModifier: چیست، اصلاح‌کننده‌های View در SwiftUI

نویسنده: IT Sectr منتشر شده: 2026-06-24 زمان مطالعه: 6 دقیقه

ViewModifier — پروتکلی در SwiftUI است که امکان ایجاد اصلاح‌کننده‌های قابل استفاده مجدد برای تغییر ظاهر و رفتار View را فراهم می‌کند. به گفته Apple Developer Documentation, 2024، ViewModifier نیاز به پیاده‌سازی متد body(content:) دارد که View اصلی را دریافت کرده و View اصلاح‌شده را برمی‌گرداند و هر ترکیبی از اصلاح‌کننده‌های داخلی را در یک نوع واحد کپسوله می‌کند. بدون این پروتکل، توسعه‌دهندگان مجبور بودند همان زنجیره‌های اصلاح‌کننده را در هر مکان استفاده تکرار کنند.

نکات کلیدی

  • ViewModifier — پروتکلی برای ایجاد اصلاح‌کننده‌های سفارشی View در SwiftUI
  • body(content:) — تنها متد الزامی که View اصلاح‌شده را برمی‌گرداند
  • اصلاح‌کننده‌های داخلی (font, padding) — متدهای توسعه View که ViewModifier را پیاده‌سازی نمی‌کنند
  • اصلاح‌کننده‌های سفارشی امکان کپسوله‌سازی ترکیب‌های تکراری سبک‌ها را فراهم می‌کنند
  • ModifiedContent — نوع بازگشتی هنگام اعمال ViewModifier به View

ViewModifier در SwiftUI چیست؟

ViewModifier — پروتکل SwiftUI است که قراردادی برای ایجاد اصلاح‌کننده‌هایی تعریف می‌کند که می‌توانند به هر نوع View اعمال شوند. این پروتکل به صورت protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body } اعلام شده است، جایی که Content نوع View اصلی ارسال‌شده به اصلاح‌کننده است.

پروتکل ViewModifier همراه با اولین نسخه SwiftUI در iOS 13 ظاهر شد و تا iOS 18+ پایدار باقی مانده است. هدف اصلی ارائه مکانیزمی به توسعه‌دهندگان برای کپسوله‌سازی زنجیره‌های تکراری اصلاح‌کننده‌ها در یک نوع قابل استفاده مجدد است. بدون ViewModifier، هر بار که نیاز به اعمال همان مجموعه سبک‌ها باشد، باید همه اصلاح‌کننده‌ها را دستی تکرار کرد.

به گفته Swift by Sundell (2023)، ViewModifier روش ترجیحی برای سازماندهی سبک‌ها در پروژه‌های SwiftUI است، زمانی که همان مجموعه اصلاح‌کننده‌ها در سه یا بیشتر مکان استفاده می‌شود. برای ترکیب‌های یکبار مصرف، زنجیره اصلاح‌کننده‌های داخلی مستقیماً روی View کافی است.

سینتکس پروتکل

پروتکل ViewModifier نیاز به پیاده‌سازی یک متد body(content:) دارد و به صورت اختیاری می‌تواند ویژگی‌هایی برای پیکربندی رفتار از طریق پارامترهای مقداردهی اولیه اصلاح‌کننده سفارشی ارائه دهد.

پروتکل ViewModifier چگونه کار می‌کند

پروتکل ViewModifier متد body(content:) را تعریف می‌کند که View اصلی (نوع Content) را دریافت کرده و View اصلاح‌شده (نوع Body) را برمی‌گرداند. SwiftUI اصلاح‌کننده را به View اعمال می‌کند، آن را به content ارسال می‌کند و از نتیجه برای نمایش استفاده می‌کند.

swift
struct CardStyle: ViewModifier {
    func body(content: Content) -> some View {
        content
            .padding(16)
            .background(Color.white)
            .cornerRadius(12)
            .shadow(radius: 4, x: 0, y: 2)
    }
}

// استفاده:
Text("سلام SwiftUI!")
    .modifier(CardStyle())

وقتی .modifier(CardStyle()) را فراخوانی می‌کنید، SwiftUI یک نمونه ModifiedContent<Text, CardStyle> ایجاد می‌کند که View اصلی و اصلاح‌کننده را ذخیره می‌کند. هنگام رندر کردن، SwiftUI CardStyle.body(content: text) را فراخوانی می‌کند و View اصلاح‌شده با padding، background، cornerRadius و shadow را دریافت می‌کند.

تفاوت مهم: ViewModifier.body در هر به‌روزرسانی View فراخوانی می‌شود، بنابراین درون body نباید محاسبات سنگین یا عوارض جانبی وجود داشته باشد. اگر اصلاح‌کننده به داده‌های خارجی (وضعیت، محیط) وابسته است، آنها را از طریق پارامترهای مقداردهی اولیه ارسال کنید.

اصلاح‌کننده‌های داخلی در مقابل سفارشی: تفاوت‌ها

اصلاح‌کننده‌های داخلی SwiftUI (font, foregroundColor, frame, padding) — متدهای توسعه پروتکل View هستند که نوع ModifiedContent را برمی‌گردانند. آنها مستقیماً ViewModifier را پیاده‌سازی نمی‌کنند — SwiftUI از پیاده‌سازی‌های داخلی بهینه‌شده برای هر اصلاح‌کننده داخلی استفاده می‌کند.

ویژگیاصلاح‌کننده‌های داخلیViewModifier سفارشی
پیاده‌سازیمتدهای توسعه Viewپروتکل ViewModifier
استفاده مجددزنجیره یکبار مصرفاستفاده چندباره
پارامترهاثابت (رنگ، اندازه)هر چیزی از طریق مقداردهی اولیه
عملکردحداکثر (بهینه‌سازی داخلی)سربار کمی بیشتر
نوع بازگشتیModifiedContentModifiedContent

ViewModifier سفارشی زمانی توجیه‌پذیر است که همان ترکیب اصلاح‌کننده‌ها در دو یا بیشتر مکان استفاده شود. برای استفاده یکبار مصرف، زنجیره مستقیم اصلاح‌کننده‌ها ترجیح داده می‌شود — کد خواناتر می‌ماند و کامپایلر بهتر بهینه‌سازی می‌کند.

به گفته WWDC 2023، اپل ایجاد ViewModifier سفارشی را برای سبک‌های مرتبط با سیستم طراحی برنامه توصیه می‌کند: کارت‌ها، دکمه‌ها، فیلدهای ورودی. این امر یکپارچگی را تضمین کرده و نگهداری را در هنگام تغییر طراحی ساده‌تر می‌کند.

الگوهای استفاده از ViewModifier

الگوی 1: کپسوله‌سازی سیستم طراحی. رایج‌ترین سناریوی استفاده از ViewModifier — ایجاد یک منبع واحد حقیقت برای سبک‌های بصری در برنامه است. هر عنصر سیستم طراحی (کارت، دکمه، عنوان) اصلاح‌کننده خود را دریافت می‌کند.

swift
struct PrimaryButton: ViewModifier {
    var isEnabled: Bool

    func body(content: Content) -> some View {
        content
            .font(.headline.weight(.semibold))
            .foregroundColor(.white)
            .padding(EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
            .background(isEnabled ? Color.blue : Color.gray)
            .cornerRadius(8)
            .opacity(isEnabled ? 1.0 : 0.6)
    }
}

الگوی 2: اعمال شرطی اصلاح‌کننده. گاهی اوقات نیاز است اصلاح‌کننده فقط در شرایط خاصی اعمال شود. ViewModifier با پارامتر بولی امکان کپسوله‌سازی این منطق را درون body فراهم می‌کند.

الگوی 3: ترکیب اصلاح‌کننده‌ها. ViewModifier می‌تواند ViewModifierهای دیگر را درون body خود اعمال کند. این امکان ساخت سلسله‌مراتب اصلاح‌کننده‌هایی را فراهم می‌کند که هر کدام مسئول جنبه خاصی از نمایش بصری هستند. برای مثال، CardStyle می‌تواند درون خود ShadowStyle و BorderStyle را اعمال کند.

به گفته Point-Free (2024)، ترکیب اصلاح‌کننده‌ها از طریق ViewModifier بر وراثت ارجحیت دارد: هر اصلاح‌کننده مسئول یک وظیفه است و می‌توان آنها را مستقل از هم ترکیب کرد. این با اصل مسئولیت منفرد در SwiftUI مطابقت دارد.

عملکرد و ترکیب اصلاح‌کننده‌ها

عملکرد ViewModifier به تعداد لفافه‌های ModifiedContent ایجاد شده در هر اعمال بستگی دارد. SwiftUI زنجیره‌های اصلاح‌کننده را از طریق diffing در مرحله رندر بهینه‌سازی می‌کند، اما تعداد زیاد اصلاح‌کننده‌ها می‌تواند به‌روزرسانی را کند کند.

تعداد اصلاح‌کننده‌هاتأثیر بر عملکردتوصیه
1–5حداقلعادی برای هر View
5–10متوسطگروه‌بندی در ViewModifier
10–20قابل توجهادغام در یک اصلاح‌کننده سفارشی
20+بحرانیبازبینی معماری View

بهینه‌سازی: چند اصلاح‌کننده متوالی از یک نوع (مثلاً چند padding) را در یکی ترکیب کنید. فقط زمانی از PreferenceKey استفاده کنید که واقعاً ضروری است — اصلاح‌کننده‌هایی که اولویت‌ها را می‌خوانند باعث عبور رندر اضافی می‌شوند.

قاعده عملی: اگر View بیش از 10 اصلاح‌کننده دارد — بخشی از آنها را به ViewModifier سفارشی منتقل کنید. این کار خوانایی را بهبود می‌بخشد و به SwiftUI اجازه می‌دهد به‌روزرسانی‌ها را بهینه‌سازی کند. به گفته SwiftUI Lab (2024)، گروه‌بندی اصلاح‌کننده‌ها در ViewModifier زمان رندر را برای Viewهای پیچیده 15–30٪ کاهش می‌دهد.

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

ViewModifier در SwiftUI چیست؟

ViewModifier — پروتکلی برای ایجاد اصلاح‌کننده‌های قابل استفاده مجدد است که ظاهر یا رفتار View را تغییر می‌دهند. این پروتکل نیاز به پیاده‌سازی متد body(content:) دارد که View اصلی را دریافت کرده و View اصلاح‌شده را برمی‌گرداند.

تفاوت ViewModifier با اصلاح‌کننده‌های داخلی چیست؟

اصلاح‌کننده‌های داخلی (font, padding) — متدهای توسعه پروتکل View هستند که از پیاده‌سازی‌های داخلی بهینه‌شده استفاده می‌کنند. ViewModifier پروتکلی برای اصلاح‌کننده‌های سفارشی است که ترکیبی از اصلاح‌کننده‌های داخلی را کپسوله کرده و می‌توانند پارامترهای مقداردهی اولیه داشته باشند.

چه زمانی باید ViewModifier سفارشی ایجاد کرد؟

زمانی که همان ترکیب اصلاح‌کننده‌ها در سه یا بیشتر مکان استفاده می‌شود، ViewModifier سفارشی ایجاد کنید. برای زنجیره‌های یکبار مصرف از اصلاح‌کننده‌های مستقیم روی View استفاده کنید — این ساده‌تر و کارآمدتر است.

آیا ViewModifier می‌تواند وضعیت (State) داشته باشد؟

بله، ViewModifier می‌تواند ویژگی‌های @State یا @Environment داشته باشد. SwiftUI چرخه زندگی آنها را مانند View مدیریت می‌کند. با این حال، به خاطر داشته باشید که body در هر به‌روزرسانی فراخوانی می‌شود، بنابراین از عملیات سنگین در بدنه اصلاح‌کننده خودداری کنید.

چگونه ViewModifier را به صورت شرطی اعمال کنیم؟

از if/else درون @ViewBuilder استفاده کنید یا یک اصلاح‌کننده با پارامتر بولی ایجاد کنید که درون body تغییرات را اعمال یا رد می‌کند. برای مثال، PrimaryButton بالا از isEnabled برای اعمال شرطی سبک استفاده می‌کند.

خلاصه

  • ViewModifier — پروتکل SwiftUI برای ایجاد اصلاح‌کننده‌های قابل استفاده مجدد View
  • body(content:) — متدی که View اصلی را دریافت کرده و View اصلاح‌شده را برمی‌گرداند
  • اصلاح‌کننده‌های داخلی — متدهای توسعه View که ViewModifier را پیاده‌سازی نمی‌کنند
  • ModifiedContent — نوعی که View اصلی و اصلاح‌کننده اعمال‌شده را ذخیره می‌کند
  • اصلاح‌کننده‌های سفارشی زمانی توجیه‌پذیرند که ترکیب در ۳+ مکان تکرار شود
  • ترکیب اصلاح‌کننده‌ها از طریق ViewModifier بر وراثت ارجحیت دارد
  • گروه‌بندی اصلاح‌کننده‌ها در ViewModifier عملکرد را ۱۵–۳۰٪ افزایش می‌دهد

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

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

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

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