ViewModifier — پروتکلی در SwiftUI است که امکان ایجاد اصلاحکنندههای قابل استفاده مجدد برای تغییر ظاهر و رفتار View را فراهم میکند. به گفته Apple Developer Documentation, 2024، ViewModifier نیاز به پیادهسازی متد body(content:) دارد که View اصلی را دریافت کرده و View اصلاحشده را برمیگرداند و هر ترکیبی از اصلاحکنندههای داخلی را در یک نوع واحد کپسوله میکند. بدون این پروتکل، توسعهدهندگان مجبور بودند همان زنجیرههای اصلاحکننده را در هر مکان استفاده تکرار کنند.
نکات کلیدی
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 متد body(content:) را تعریف میکند که View اصلی (نوع Content) را دریافت کرده و View اصلاحشده (نوع Body) را برمیگرداند. SwiftUI اصلاحکننده را به View اعمال میکند، آن را به content ارسال میکند و از نتیجه برای نمایش استفاده میکند.
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 |
| استفاده مجدد | زنجیره یکبار مصرف | استفاده چندباره |
| پارامترها | ثابت (رنگ، اندازه) | هر چیزی از طریق مقداردهی اولیه |
| عملکرد | حداکثر (بهینهسازی داخلی) | سربار کمی بیشتر |
| نوع بازگشتی | ModifiedContent | ModifiedContent |
ViewModifier سفارشی زمانی توجیهپذیر است که همان ترکیب اصلاحکنندهها در دو یا بیشتر مکان استفاده شود. برای استفاده یکبار مصرف، زنجیره مستقیم اصلاحکنندهها ترجیح داده میشود — کد خواناتر میماند و کامپایلر بهتر بهینهسازی میکند.
به گفته WWDC 2023، اپل ایجاد ViewModifier سفارشی را برای سبکهای مرتبط با سیستم طراحی برنامه توصیه میکند: کارتها، دکمهها، فیلدهای ورودی. این امر یکپارچگی را تضمین کرده و نگهداری را در هنگام تغییر طراحی سادهتر میکند.
الگوی 1: کپسولهسازی سیستم طراحی. رایجترین سناریوی استفاده از ViewModifier — ایجاد یک منبع واحد حقیقت برای سبکهای بصری در برنامه است. هر عنصر سیستم طراحی (کارت، دکمه، عنوان) اصلاحکننده خود را دریافت میکند.
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 — پروتکلی برای ایجاد اصلاحکنندههای قابل استفاده مجدد است که ظاهر یا رفتار View را تغییر میدهند. این پروتکل نیاز به پیادهسازی متد body(content:) دارد که View اصلی را دریافت کرده و View اصلاحشده را برمیگرداند.
اصلاحکنندههای داخلی (font, padding) — متدهای توسعه پروتکل View هستند که از پیادهسازیهای داخلی بهینهشده استفاده میکنند. ViewModifier پروتکلی برای اصلاحکنندههای سفارشی است که ترکیبی از اصلاحکنندههای داخلی را کپسوله کرده و میتوانند پارامترهای مقداردهی اولیه داشته باشند.
زمانی که همان ترکیب اصلاحکنندهها در سه یا بیشتر مکان استفاده میشود، ViewModifier سفارشی ایجاد کنید. برای زنجیرههای یکبار مصرف از اصلاحکنندههای مستقیم روی View استفاده کنید — این سادهتر و کارآمدتر است.
بله، ViewModifier میتواند ویژگیهای @State یا @Environment داشته باشد. SwiftUI چرخه زندگی آنها را مانند View مدیریت میکند. با این حال، به خاطر داشته باشید که body در هر بهروزرسانی فراخوانی میشود، بنابراین از عملیات سنگین در بدنه اصلاحکننده خودداری کنید.
از if/else درون @ViewBuilder استفاده کنید یا یک اصلاحکننده با پارامتر بولی ایجاد کنید که درون body تغییرات را اعمال یا رد میکند. برای مثال، PrimaryButton بالا از isEnabled برای اعمال شرطی سبک استفاده میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید