ViewModifier হল SwiftUI-তে একটি প্রোটোকল যা View-এর চেহারা এবং আচরণ পরিবর্তনের জন্য পুনঃব্যবহারযোগ্য মডিফায়ার তৈরি করতে দেয়। Apple Developer Documentation, 2024 অনুসারে, ViewModifier-এ body(content:) method বাস্তবায়ন করা আবশ্যক, যা মূল 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 প্রোটোকলে একটি method body(content:) বাস্তবায়ন করা আবশ্যক এবং ঐচ্ছিকভাবে কাস্টম মডিফায়ারের ইনিশিয়ালাইজার প্যারামিটারের মাধ্যমে আচরণ কাস্টমাইজ করার জন্য প্রপার্টি সরবরাহ করতে পারে।
ViewModifier প্রোটোকল body(content:) method সংজ্ঞায়িত করে, যা মূল 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) কল করে, padding, background, cornerRadius এবং shadow সহ একটি পরিবর্তিত View পায়।
গুরুত্বপূর্ণ পার্থক্য: ViewModifier.body প্রতিবার View আপডেট হলে কল করা হয়, তাই body-র ভিতরে ভারী গণনা বা সাইড ইফেক্ট থাকা উচিত নয়। যদি মডিফায়ার বাহ্যিক ডেটার (state, environment) উপর নির্ভর করে, তবে সেগুলো ইনিশিয়ালাইজার প্যারামিটারের মাধ্যমে পাঠান।
SwiftUI-এর বিল্ট-ইন মডিফায়ার (font, foregroundColor, frame, padding) View প্রোটোকলের এক্সটেনশন method যা ModifiedContent টাইপ ফেরত দেয়। তারা সরাসরি ViewModifier বাস্তবায়ন করে না — SwiftUI প্রতিটি বিল্ট-ইন মডিফায়ারের জন্য অভ্যন্তরীণ অপ্টিমাইজড বাস্তবায়ন ব্যবহার করে।
| বৈশিষ্ট্য | বিল্ট-ইন মডিফায়ার | কাস্টম ViewModifier |
|---|---|---|
| বাস্তবায়ন | View এক্সটেনশন method | 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 তার body-র ভিতরে অন্য ViewModifier প্রয়োগ করতে পারে। এটি মডিফায়ারের একটি শ্রেণিবিন্যাস তৈরি করতে দেয়, যেখানে প্রতিটি ভিজুয়াল প্রস্তুতির নিজস্ব দিকের জন্য দায়়ী। উদাহরণস্বরূপ, CardStyle অভ্যন্তরীণভাবে ShadowStyle এবং BorderStyle প্রয়োগ করতে পারে।
Point-Free (2024) অনুসারে, ViewModifier-এর মাধ্যমে মডিফায়ারের কম্পোজিশন উত্তরাধিকার থেকে পছন্দনীয়: প্রতিটি মডিফায়ার একটি কাজের জন্য দায়়ী এবং এগুলো স্বাধীনভাবে একত্রিত করা যায়। এটি SwiftUI-তে একক দায়়িত্ব নীতি অনুসরণ করে।
ViewModifier-এর পারফরমান্যাস প্রতিটি প্রয়োগের সাথে তৈরি ModifiedContent র্যাপারের সংখ্যার উপর নির্ভর করে। SwiftUI রেন্ডারিং ধাপে ডিফিং-এর মাধ্যমে মডিফায়ার চেইন অপ্টিমাইজ করে, কিন্তু মডিফায়ারের অত্যধিক সংখ্যা আপডেট ধীর করতে পারে।
| মডিফায়ারের সংখ্যা | পারফরমান্যাসে প্রভাব | সুপারিশ |
|---|---|---|
| 1–5 | সর্বনিম্ন | যেকোনো View-এর জন্য স্বাভাবিক |
| 5–10 | মাঝারি | ViewModifier-এ গ্রুপ করুন |
| 10–20 | লক্ষ্যণীয় | একটি কাস্টম মডিফায়ারে একত্রিত করুন |
| 20+ | গুরুতর | View আর্কিটেক্চার পুনর্বিবেচনা করুন |
অপ্টিমাইজেশন: একই টাইপের একাধিক অনুক্রমিক মডিফায়ার (যেমন, একাধিক padding) একটিতে একত্রিত করুন। PreferenceKey শুধুমাত্র যখন সত্যিই প্রয়োজন তখন ব্যবহার করুন — মডিফায়ার যা প্রেফারেন্স পড়ে তা অতিরিক্ত রেন্ডারিং পাস ট্রিগার করে।
সাধারণ নিয়ম: যদি একটি View-এ 10-এর বেশি মডিফায়ার থাকে — সেগুলোর কিছু একটি কাস্টম ViewModifier-এ বের করে নিন। এটি পঠনযোগ্যতা উন্নত করবে এবং SwiftUI আপডেট অপ্টিমাইজ করতে দেবে। SwiftUI Lab (2024) অনুসারে, ViewModifier-এ মডিফায়ার গ্রুপ করা জটিল Views-এর জন্য রেন্ডারিং সময় 15–30% কমায়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
ViewModifier হল পুনঃব্যবহারযোগ্য মডিফায়ার তৈরির জন্য একটি প্রোটোকল যা View-এর চেহারা বা আচরণ পরিবর্তন করে। এতে body(content:) method বাস্তবায়ন করা আবশ্যক, যা মূল View গ্রহণ করে এবং একটি পরিবর্তিত View ফেরত দেয়।
বিল্ট-ইন মডিফায়ার (font, padding) View প্রোটোকলের এক্সটেনশন method যা অভ্যন্তরীণ অপ্টিমাইজড বাস্তবায়ন ব্যবহার করে। ViewModifier হল কাস্টম মডিফায়ারের জন্য একটি প্রোটোকল যা বিল্ট-ইনগুলোর সমন্বয় এনক্যাপসুলেট করে এবং ইনিশিয়ালাইজার প্যারামিটার থাকতে পারে।
কাস্টম ViewModifier তৈরি করুন যখন মডিফায়ারের একই সমন্বয় তিন বা ততোধিক জায়গায় ব্যবহৃত হয়। একবারের চেইনের জন্য, View-এ সরাসরি মডিফায়ার ব্যবহার করুন — এটি সহজ এবং আরও কার্যকর।
হ্যাঁ, ViewModifier-এ @State বা @Environment প্রপার্টি থাকতে পারে। SwiftUI তাদের lifecycle View-এর মতোই পরিচালনা করে। তবে মনে রাখবেন, body প্রতি আপডেটে কল হয়, তাই মডিফায়ারের body-তে ভারী অপারেশন এড়িয়ে চলুন।
@ViewBuilder-এর ভিতরে if/else ব্যবহার করুন বা একটি বুলিয়ান প্যারামিটার সহ একটি মডিফায়ার তৈরি করুন যা body-র ভিতরে শর্তসাপেক্ষে পরিবর্তন প্রয়োগ বা বাদ দেয়। উদাহরণস্বরূপ, উপরে PrimaryButton শর্তসাপেক্ষে স্টাইল প্রয়োগের জন্য isEnabled ব্যবহার করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন