ViewModifier هو بروتوكول في SwiftUI يتيح إنشاء معدّلات قابلة لإعادة الاستخدام لتغيير مظهر وسلوك الـ View. وفقاً لـ Apple Developer Documentation, 2024، ViewModifier يتطلب تنفيذ method body(content:)، الذي يأخذ الـ View الأصلية ويعيد View معدّلة، محتجزاً أي مجموعة من المعدّلات المدمجة في نوع واحد. بدون هذا البروتوكول، كان سيتعين على المطورين تكرار نفس سلاسل المعدّلات في كل نقطة استخدام.
الخلاصة
ViewModifier هو بروتوكول SwiftUI يحدد عقداً لإنشاء معدّلات يمكن تطبيقها على أي نوع View. يتم تعريفه كـ protocol ViewModifier { associatedtype Body: View; func body(content: Content) -> Body }، حيث Content هو نوع الـ View الأصلية التي تم تمريرها إلى المعدّل.
ظهر بروتوكول ViewModifier في iOS 13 مع أول إصدار من SwiftUI ولا يزال مستقراً حتى iOS 18+ شاملاً. الهدف الرئيسي هو توفير آلية للمطورين لتغليف سلاسل المعدّلات المتكررة في نوع واحد قابل لإعادة الاستخدام. بدون ViewModifier، في كل مرة كنت تحتاج فيها إلى تطبيق نفس مجموعة الأنماط، كان عليك تكرار جميع المعدّلات يدوياً.
وفقاً لـ Swift by Sundell (2023)، ViewModifier هو الطريقة المفضلة لتنظيم الأنماط في مشاريع SwiftUI عندما يتم استخدام نفس مجموعة المعدّلات في ثلاثة أماكن أو أكثر. للتركيبات لمرة واحدة، يكفي سلسلة من المعدّلات المدمجة مباشرة على الـ View.
يتطلب بروتوكول ViewModifier تطبيق method واحد body(content:) ويمكنه اختيارياً توفير خصائص لتخصيص السلوك عبر معاملات المُهيئ للمعدّل المخصص.
بروتوكول ViewModifier يحدد method 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، توصي Apple بإنشاء 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 يقلل وقت العرض بنسبة 15–30% للـ Views المعقدة.
الأسئلة الشائعة
ViewModifier هو بروتوكول لإنشاء معدّلات قابلة لإعادة الاستخدام تغير مظهر أو سلوك الـ View. يتطلب تنفيذ method body(content:)، الذي يأخذ الـ View الأصلية ويعيد View معدّلة.
المعدّلات المدمجة (font, padding) هي طرق تمديد لبروتوكول View تستخدم تطبيقات داخلية محسّنة. ViewModifier هو بروتوكول للمعدّلات المخصصة التي تغلف مجموعة من المعدّلات المدمجة ويمكن أن تحتوي على معاملات مُهيئ.
أنشئ ViewModifier مخصص عندما يتم استخدام نفس المجموعة من المعدّلات في ثلاثة أماكن أو أكثر. للسلاسل لمرة واحدة، استخدم معدّلات مباشرة على الـ View — إنه أبسط وأكثر كفاءة.
نعم، يمكن أن يحتوي ViewModifier على خصائص @State أو @Environment. يدير SwiftUI دورة حياتها بنفس الطريقة كما هو الحال مع View. ومع ذلك، تذكر أنه يتم استدعاء body في كل تحديث، لذلك تجنب العمليات الثقيلة في جسم المعدّل.
استخدم if/else داخل @ViewBuilder أو أنشئ معدّلاً بمعامل منطقي يطبق أو يتخطى التغييرات بشكل شرطي داخل body. على سبيل المثال، PrimaryButton أعلاه يستخدم isEnabled للتطبيق الشرطي للنمط.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا