.modifier() SwiftUI میں View پروٹوکول کا ایک طریقہ ہے جو کسی بھی View قسم پر حسب ضرورت ViewModifier مثال لاگو کرتا ہے۔ Apple Developer Documentation, 2024 کے مطابق، یہ طریقہ ایک ViewModifier لیتا ہے اور ModifiedContent لوٹاتا ہے، اصل View کو ایک ترمیم شدہ ورژن میں لپیٹتا ہے۔ بلٹ ان موڈیفائر کے برعکس، جو مقررہ پیرامیٹرز والے توسیعی طریقے ہیں، .modifier() ViewModifier پروٹوکول کو لاگو کرنے والی قسم میں منسلک کسی بھی حسب ضرورت منطق کے استعمال کی اجازت دیتا ہے۔
اہم نکات
.modifier() View پروٹوکول میں اعلان کردہ ایک طریقہ ہے: func modifier<M: ViewModifier>(_ modifier: M) -> ModifiedContent<Self, M>۔ یہ ViewModifier کو لاگو کرنے والی قسم کی ایک مثال لیتا ہے اور ModifiedContent قسم میں لپٹی ہوئی ترمیم شدہ View لوٹاتا ہے۔
یہ طریقہ iOS 13 میں ظاہر ہوا اور SwiftUI میں حسب ضرورت موڈیفائر لاگو کرنے کا بنیادی طریقہ ہے۔ بلٹ ان موڈیفائر (font, foregroundColor, frame) کے برعکس جو براہ راست View پر کال کیے جاتے ہیں، .modifier() کے لیے پہلے سے ایک موڈیفائر قسم بنانا ضروری ہے۔ یہ تجرید کی ایک سطح شامل کرتا ہے لیکن دوبارہ استعمال اور پیرامیٹرائزیشن کے مواقع کھولتا ہے۔
Hacking with Swift (2024) کے مطابق، .modifier() ہر SwiftUI پروجیکٹ میں استعمال ہوتا ہے جہاں بار بار آنے والے UI عناصر کے لیے ایک مستقل انداز کی ضرورت ہوتی ہے۔ یہ طریقہ بلٹ ان موڈیفائر کی زنجیر کے مقابلے میں کوئی اوور ہیڈ نہیں ڈالتا — کمپائلر کال کو بہتر بناتا ہے۔
modifier طریقہ ایک عام پیرامیٹر M لیتا ہے جو ViewModifier پروٹوکول سے محدود ہے۔ عام اقسام کی بدولت، کمپائلر ٹھوس موڈیفائر قسم جانتا ہے اور ٹائپ ایریزر کے بغیر نتیجے کی View قسم کو بہتر بنا سکتا ہے۔
modifier(_:) طریقہ ایک ModifiedContent مثال بناتا ہے جو اصل View (Self) کو منتقل کردہ موڈیفائر (M) سے جوڑتا ہے۔ رینڈرنگ کے دوران، SwiftUI M.body(content: self) کال کرتا ہے، اصل View کو content پیرامیٹر کے طور پر منتقل کرتا ہے۔
struct RoundedBorder: ViewModifier {
let color: Color
let width: CGFloat
func body(content: Content) -> some View {
content
.padding(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(color, lineWidth: width)
)
}
}
// .modifier() کے ذریعے لاگو کریں:
Text("ہیلو")
.modifier(RoundedBorder(color: .blue, width: 2))
// مساوی براہ راست زنجیر:
Text("ہیلو")
.padding(8)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(Color.blue, lineWidth: 2)
)
اطلاق کا ترتیب: موڈیفائر باہر سے اندر کی طرف لاگو ہوتے ہیں۔ پہلی .modifier() کال View کو باہر سے لپیٹتی ہے، دوسری — پہلے کے اوپر، اور اسی طرح۔ ساخت بناتے وقت یہ اہم ہے — ترتیب بصری نتیجہ کو متاثر کرتی ہے۔
Apple WWDC 2022 کے مطابق، SwiftUI ModifiedContent کے درجہ بندی میں تبدیلیوں کا پتہ لگانے کے لیے شناخت پر مبنی فرق (Identity-based diffing) استعمال کرتا ہے۔ موڈیفائر کی قسم (M) View کی شناخت بنانے میں حصہ لیتی ہے، لہٰذا مختلف موڈیفائر اقسام ہمیشہ نئی شناختیں بناتی ہیں، چاہے بصری نتیجہ ایک جیسا ہی کیوں نہ ہو۔
بلٹ ان موڈیفائر SwiftUI میں View پروٹوکول میں اعلان کردہ توسیعی طریقے ہیں۔ ہر بلٹ ان موڈیفائر (font, foregroundColor, padding) کی اپنی اندرونی تعمیر ہے جو Apple نے بہتر بنائی ہے۔ وہ ViewModifier پروٹوکول استعمال نہیں کرتے اور .modifier() کے ذریعے کال نہیں کیے جاتے۔
| خصوصیت | .modifier() | بلٹ ان موڈیفائر |
|---|---|---|
| پروٹوکول | ViewModifier | View توسیعی طریقے |
| دوبارہ استعمال | کسی بھی تعداد میں | کوڈ کی تکرار درکار |
| پیرامیٹرائزیشن | انیشیالائزر کے ذریعے | مقررہ پیرامیٹرز |
| گروپ بندی | ایک میں کئی موڈیفائر | ہر ایک علیحدہ |
| کارکردگی | موازنہ کے قابل | زیادہ سے زیادہ |
.modifier() کب استعمال کریں: جب موڈیفائر کا ایک ہی مجموعہ ایپلیکیشن کے متعدد مقامات پر لاگو ہوتا ہے۔ یہ انداز کے لیے ایک واحد سچائی کا ذریعہ فراہم کرتا ہے اور ری فیکٹرنگ کو آسان بناتا ہے۔ براہ راست موڈیفائر کب استعمال کریں: کسی خاص View کے لیے ایک بار کے استعمال کے لیے۔
Objc.io (2023) کے مطابق، .modifier() اور بلٹ ان موڈیفائر کی زنجیر کے درمیان کارکردگی کا فرق اعدادوشمار کے لحاظ سے ناچیز ہے (رینڈرنگ وقت کا 1% سے کم)۔ انتخاب کا تعین کارکردگی سے نہیں بلکہ پڑھنے کی اہلیت اور دوبارہ استعمال سے ہونا چاہیے۔
موڈیفائر کا مشروط اطلاق SwiftUI میں ایک عام کام ہے۔ ternary آپریٹر کے ذریعے معیاری طریقہ .modifier() کے ساتھ کام نہیں کرتا کیونکہ مختلف موڈیفائر اقسام مختلف ModifiedContent اقسام کا سبب بنتی ہیں۔
// ❌ کمپائل نہیں ہوتا — مختلف موڈیفائر اقسام:
var body: some View {
Text("مشروط")
.modifier(isActive ? HighlightStyle() : DefaultStyle())
}
// ✅ درست: @ViewBuilder کے اندر if/else:
@ViewBuilder
var body: some View {
if isActive {
Text("مشروط").modifier(HighlightStyle())
} else {
Text("مشروط").modifier(DefaultStyle())
}
}
// ✅ یا پیرامیٹر والا موڈیفائر:
struct ConditionalStyle: ViewModifier {
let isActive: Bool
func body(content: Content) -> some View {
content
.foregroundColor(isActive ? .blue : .gray)
.opacity(isActive ? 1.0 : 0.5)
}
}
Text("مشروط").modifier(ConditionalStyle(isActive: isActive))
سفارش: سادہ شرائط (دکھائیں/چھپائیں، رنگ تبدیل کریں) کے لیے پیرامیٹر والا موڈیفائر استعمال کریں۔ مختلف موڈیفائر سیٹوں والی پیچیدہ مشروط منطق کے لیے — @ViewBuilder کے اندر if/else استعمال کریں۔ دوسرا طریقہ زیادہ پڑھنے کے قابل ہے لیکن کوڈ کی تکرار کا سبب بن سکتا ہے۔
موڈیفائر کی زنجیر ایک ہی View پر لاگو .modifier() اور بلٹ ان موڈیفائر کالز کا ایک سلسلہ ہے۔ ہر کال ایک نیا ریپر پرت بناتی ہے، اور تمام پرتیں nested generics کے ذریعے ایک ہی View قسم میں مل جاتی ہیں۔
SwiftUI موڈیفائر زنجیر کی نمائندگی کے لیے ایک قسم کا نظام استعمال کرتا ہے۔ مثال کے طور پر، Text().font(.title).padding() کی قسم ModifiedContent<ModifiedContent<Text, _FontModifier>, _PaddingLayout> ہے۔ ہر بلٹ ان موڈیفائر کی اپنی اندرونی موڈیفائر ساخت ہے جو ڈویلپر سے پوشیدہ ہے۔
قسم کا مسئلہ: ModifiedContent اقسام کی گہری nesting کمپائلیشن کو سست کرتی ہے اور غلطی کے پیغامات کو پیچیدہ بناتی ہے۔ حسب ضرورت ViewModifier متعدد پرتوں کو ایک میں «جوڑنے» کی اجازت دیتے ہیں، نتیجے کی قسم کو آسان بناتے ہیں اور کمپائلیشن کی رفتار کو بہتر بناتے ہیں۔ Swift Compiler Team (2024) کے مطابق، 5–7 ترتیب وار موڈیفائر کو ایک ViewModifier سے بدلنا پیچیدہ Views کے لیے کمپائلیشن وقت میں 10–20% کمی لاتا ہے۔
عملی اصول: اگر ایک View 8 سے زیادہ موڈیفائر استعمال کرتی ہے — تو ان میں سے کچھ کو حسب ضرورت ViewModifier میں نکالیں۔ اس سے کمپائلیشن تیز ہوگی اور پڑھنے کی اہلیت بہتر ہوگی۔
اکثر پوچھے گئے سوالات
.modifier() View پر ایک حسب ضرورت ViewModifier لاگو کرتا ہے، ModifiedContent لوٹاتا ہے۔ یہ ViewModifier پروٹوکول کے ذریعے بنائے گئے حسب ضرورت موڈیفائر استعمال کرنے کا بنیادی طریقہ ہے، اور بلٹ ان موڈیفائر کی براہ راست زنجیر کا متبادل ہے۔
.modifier() ViewModifier پروٹوکول کی ایک مثال لیتا ہے، جس سے تبدیلیوں کے کسی بھی مجموعہ کو منسلک کرنے کی اجازت ملتی ہے۔ بلٹ ان موڈیفائر (font, padding) مقررہ منطق والے View توسیعی طریقے ہیں۔ کارکردگی کا فرق کم سے کم ہے؛ انتخاب کا تعین دوبارہ استعمال سے ہوتا ہے۔
ہاں، @ViewBuilder کے اندر if/else کے ذریعے یا boolean پیرامیٹر والے موڈیفائر کے ذریعے۔ مختلف ModifiedContent اقسام کی وجہ سے براہ راست ternary آپریٹر کام نہیں کرتا۔ سادہ شرائط کے لیے پیرامیٹر پر مبنی طریقہ اور پیچیدہ منطق کے لیے if/else تجویز کیا جاتا ہے۔
موڈیفائر باہر سے اندر کی طرف لاگو ہوتے ہیں: پہلا .modifier() View کو باہر سے لپیٹتا ہے، بعد والے اوپر آتے ہیں۔ بصری نتیجہ کے لیے ترتیب اہم ہے، خاص طور پر overlay، padding اور frame کے ساتھ کام کرتے وقت۔
اثر اعدادوشمار کے لحاظ سے ناچیز ہے (رینڈرنگ وقت کا 1% سے کم)۔ مزید برآں، متعدد موڈیفائر کو ایک ViewModifier میں گروپ کرنا ModifiedContent پرتوں کی تعداد کم کرکے اور کمپائلر کے لیے قسم آسان بناکر کارکردگی کو بہتر بنا سکتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں