@State হল SwiftUI-তে একটি Property Wrapper যা একটি একক ভিউয়ের ভেতরে স্থানীয় অবস্থা পরিচালনার জন্য। SwiftUI স্বয়ংক্রিয়ভাবে ভিউটি পুনরায় আঁকে যখন একটি @State প্রপার্টি পরিবর্তিত হয়, ম্যানুয়াল আপডেট কল ছাড়াই ইন্টারফেসকে প্রতিক্রিয়াশীল করে তোলে। Apple Developer Documentation (2025) অনুসারে, @State সরল টাইপ এবং স্ট্রাকচারের জন্য সুপারিশ করা হয় যা একটি একক ভিউয়ের অন্তর্গত। @State হল SwiftUI ইন্টারফেসে ইন্টারঅ্যাকটিভিটি যোগ করার সবচেয়ে সহজ উপায়।
মূল পয়েন্ট
@State হল SwiftUI-তে নির্মিত একটি Property Wrapper যা একটি ভিউকে তার নিজস্ব অবস্থা সংরক্ষণ এবং ট্র্যাক করতে দেয়। যখন একটি @State মান পরিবর্তিত হয়, SwiftUI স্বয়ংক্রিয়ভাবে body প্রপার্টি পুনরায় কল করে ভিউটি পুনরায় আঁকে। এটি SwiftUI-তে প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের ভিত্তি: ডেভেলপার অবস্থা ঘোষণা করে, এবং ফ্রেমওয়ার্ক ইন্টারফেস সিঙ্ক্রোনাইজেশন পরিচালনা করে।
@State SwiftUI-র দ্বারা পরিচালিত heap-এ একটি স্টোরেজ এলাকা তৈরি করে। এই এলাকাটি স্থায়ী — এটি ভিউ স্ট্রাক্টের পুনরাবৃত্ত আরম্ভীকরণ থেকে বেঁচে থাকে, যা প্রতিটি রেন্ডারে ঘটে। SwiftUI একটি নির্দিষ্ট ভিউয়ের সাথে @State প্রপার্টি বাঁধতে ভিউয়ের শনাক্তকারী (পদানুক্রমে তার অবস্থান থেকে উৎপন্ন) ব্যবহার করে। এর জন্য, প্যারেন্ট ভিউ আপডেট হলে অবস্থা রিসেট হয় না।
একটি গুরুত্বপূর্ণ সীমাবদ্ধতা: @State শুধুমাত্র মান টাইপের (struct, enum, primitive) জন্য। রেফারেন্স টাইপের (ক্লাস) জন্য, @StateObject বা @ObservedObject ব্যবহার করুন। যদি আপনি @State প্রপার্টিতে একটি ক্লাস অ্যাসাইন করেন, SwiftUI অবজেক্টের ভিতরে পরিবর্তন সনাক্ত করতে সক্ষম হবে না — শুধুমাত্র সম্পূর্ণ রেফারেন্স প্রতিস্থাপন।
SwiftUI @State একটি অভ্যন্তরীণ Storage প্রক্রিয়ার মাধ্যমে বাস্তবায়ন করে। প্রতিটি @State প্রপার্টি ভিউয়ের একটি বিশেষ স্টোরেজ কন্টেইনারে সংরক্ষিত একটি ডেডিকেটেড মেমরি সেল পায়। যখন wrappedValue-তে লেখা হয়, SwiftUI didSet-এর মাধ্যমে তার নির্ভরতা গ্রাফকে পুনরায় আঁকার প্রয়োজনীয়তা সম্পর্কে জানায়।
struct ContentView: View {
@State private var name: String = "User"
@State private var isLoggedIn: Bool = false
var body: some View {
VStack {
Text("হ্যালো, \(name)")
Button(isLoggedIn ? "লগ আউট" : "লগ ইন") {
isLoggedIn.toggle()
}
}
}
}
উদাহরণে, দুটি @State প্রপার্টি আছে: name (String) এবং isLoggedIn (Bool)। যখন isLoggedIn.toggle() কল করা হয়, SwiftUI ContentView-কে আপডেট প্রয়োজন হিসাবে চিহ্নিত করে এবং পরবর্তী রেন্ডার চক্রে body পুনরায় কল করে। মূল পয়েন্ট: @State প্রপার্টি সবসময় private মডিফায়ার দিয়ে ঘোষণা করা হয় — এটি সংকেত দেয় যে অবস্থাটি একচেটিয়াভাবে বর্তমান ভিউয়ের এবং বাইরে থেকে সরাসরি পরিবর্তন করা উচিত নয়।
পরিবর্তন পর্যবেক্ষণের জন্য, SwiftUI Combine থেকে CurrentValueSubject ব্যবহার করে। প্রতিটি @State প্রপার্টি একটি লুকানো প্রকাশক তৈরি করে যা প্রতিটি পরিবর্তনে সিস্টেমকে জানায়। এটি SwiftUI-কে শুধুমাত্র ন্যূনতম প্রয়োজনীয় ভিউ সেট পুনরায় আঁকার অনুমতি দেয়, সম্পূর্ণ পদানুক্রম আপডেট এড়িয়ে।
@State সরল স্থানীয় অবস্থার জন্য সর্বোত্তম: অনুসন্ধানে টেক্সট ফিল্ড, মডাল উইন্ডোর জন্য বুলিয়ান ফ্ল্যাগ, সেটিংস টগল, কাউন্টার, নির্বাচিত তালিকা আইটেম। যদি একটি মান শুধুমাত্র একটি ভিউ এবং তার চাইল্ড কম্পোনেন্টে (@Binding-এর মাধ্যমে) ব্যবহার করা হয়, @State সঠিক পছন্দ। যে অবস্থাগুলি ভিউ বন্ধ হওয়ার পরেও টিকে থাকা উচিত (যেমন ফর্ম ডেটা), @State ততক্ষণ কাজ করে যতক্ষণ ভিউ পদানুক্রমে থাকে।
@State বৈশ্বিক অ্যাপ্লিকেশন অবস্থা, নেটওয়ার্ক ডেটা ক্যাশিং, বা একাধিক স্ক্রিনে ব্যবহৃত অবজেক্টের জন্য ব্যবহার করবেন না। @StateObject এবং @EnvironmentObject এই উদ্দেশ্যে ডিজাইন করা হয়েছে। এছাড়াও, @State বড় পরিমাণ ডেটা সংরক্ষণের জন্য উপযুক্ত নয় — প্রতিটি পরিবর্তন সম্পূর্ণ ভিউ পুনরায় আঁকবে।
@Binding প্যারেন্ট ভিউতে @State এবং চাইল্ড ভিউয়ের মধ্যে একটি সেতু যা সেই অবস্থা পরিবর্তন করতে পারে। প্যারেন্ট @State ঘোষণা করে, এবং চাইল্ড কম্পোনেন্ট $ প্রজেকশনের মাধ্যমে Binding পায়। চাইল্ড ভিউতে Binding পরিবর্তন করলে প্যারেন্টে @State স্বয়ংক্রিয়ভাবে আপডেট হয় — এবং এর বিপরীতও। এটি প্রতিক্রিয়া ক্ষমতা সহ একমুখী ডেটা প্রবাহ নিশ্চিত করে।
struct ParentView: View {
@State private var text: String = ""
var body: some View {
ChildView(text: $text)
}
}
struct ChildView: View {
@Binding var text: String
var body: some View {
TextField("Enter text", text: $text)
}
}
লিস্টিংয়ে, ParentView-এর @State text আছে, এবং ChildView $text কে Binding হিসেবে পায়। ChildView-এর ভিতরে TextField text: $text-এর মাধ্যমে এই Binding-এর সাথে সংযুক্ত হয়। যখন ব্যবহারকারী TextField-এ টাইপ করে, Binding-এর মাধ্যমে ChildView-তে মান পরিবর্তিত হয়, যা ParentView-তে @State-এর আপডেট ঘটায়। উভয় ভিউ নতুন মান দিয়ে পুনরায় আঁকা হয়।
সবচেয়ে সাধারণ ভুল হল @State প্রপার্টিতে একটি ক্লাস অ্যাসাইন করা। যদি আপনি @State var model = MyClass() লেখেন, SwiftUI ক্লাসের ভিতরে প্রপার্টির পরিবর্তন ট্র্যাক করতে পারবে না — শুধুমাত্র অবজেক্ট প্রতিস্থাপন। ক্লাসের জন্য, সবসময় @StateObject ব্যবহার করুন। দ্বিতীয় সাধারণ সমস্যা হল private মডিফায়ার ছাড়া @State ঘোষণা করা, যা অবস্থা এনক্যাপসুলেশনের নীতি লঙ্ঘন করে।
সরাসরি @State পাস করা $ ছাড়া চাইল্ড ভিউতে আরেকটি সাধারণ ভুল। যদি আপনি TextField(text: $text)-এর পরিবর্তে TextField(text: text) পাস করেন, চাইল্ড কম্পোনেন্ট শুধুমাত্র একটি স্ট্রিং পায়, Binding নয়। TextField-এ টেক্সট পরিবর্তন প্যারেন্টের @State-এর সাথে সিঙ্ক্রোনাইজ হবে না। Binding পাস করতে সবসময় $ প্রজেকশন ব্যবহার করুন।
তৃতীয় ভুল হল সম্পর্কিত ডেটার জন্য একাধিক @State প্রপার্টি। যদি একাধিক মান যৌক্তিকভাবে একটি সম্পূর্ণ গঠন করে (যেমন ফর্ম ফিল্ড), সেগুলিকে একটি একক @State সহ একটি স্ট্রাক্টে একত্রিত করুন। এটি চাইল্ড ভিউতে অবস্থা পাস করা সহজ করে এবং পৃথক আপডেট ট্রিগারের সংখ্যা হ্রাস করে।
@State অধিকাংশ SwiftUI প্রকল্পে মৌলিক ইন্টারঅ্যাকটিভিটির জন্য ব্যবহৃত হয়। একটি লগইন ফর্ম উদাহরণ বিবেচনা করুন যেখানে @State টেক্সট ফিল্ড এবং লোডিং অবস্থা পরিচালনা করে। এই প্যাটার্ন প্রতিটি অ্যাপ্লিকেশনে দেখা যায় — সরল নোট থেকে জটিল এন্টারপ্রাইজ সমাধান পর্যন্ত।
struct LoginView: View {
@State private var email: String = ""
@State private var password: String = ""
@State private var isLoading: Bool = false
@State private var errorMessage: String?
var body: some View {
Form {
TextField("Email", text: $email)
SecureField("Password", text: $password)
Button("লগ ইন") {
login()
}.disabled(isLoading)
}
}
private func login() {
isLoading = true
// নেটওয়ার্ক অনুরোধ সম্পাদন করুন
}
}
উদাহরণে, চারটি @State প্রপার্টি আছে: email এবং password ফর্ম ফিল্ডের জন্য, isLoading লোডিং নির্দেশের জন্য, এবং errorMessage ত্রুটি প্রদর্শনের জন্য। প্রতিটি প্রপার্টি স্বাধীনভাবে তার ইন্টারফেস অংশ পরিচালনা করে। যখন isLoading পরিবর্তিত হয়, বোতাম disabled(isLoading)-এর মাধ্যমে স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় হয় — ম্যানুয়াল UI আপডেট ছাড়াই।
সচরাচর জিজ্ঞাসা
@State একটি নির্দিষ্ট ভিউয়ের স্থানীয় অবস্থার জন্য ডিজাইন করা হয়েছে। private মডিফায়ার নিশ্চিত করে যে অন্যান্য কম্পোনেন্ট এটি সরাসরি পরিবর্তন করতে না পারে, যা এনক্যাপসুলেশন ভেঙে দেবে। বাহ্যিক অ্যাক্সেসের জন্য, $ প্রজেকশন ব্যবহার করুন।
হ্যাঁ, @State অ্যারে এবং ডিকশনারি সমর্থন করে কারণ এগুলি মান টাইপ। তবে, যখন অ্যারের একটি উপাদান পরিবর্তিত হয়, SwiftUI সম্পূর্ণ ভিউ পুনরায় আঁকে। বড় তালিকার জন্য, @Published সহ @StateObject বেশি কার্যকর।
@State Optional টাইপের সাথে সঠিকভাবে কাজ করে। nil অ্যাসাইন করলে, SwiftUI পরিবর্তন সনাক্ত করে এবং ভিউ পুনরায় আঁকে। এটি errorMessage: String?-এর মতো অবস্থার জন্য সুবিধাজনক, যেখানে nil মানে কোনো ত্রুটি নেই।
@State মান সংরক্ষণ করে যতক্ষণ ভিউ পদানুক্রমে থাকে। যদি ভিউ পদানুক্রম থেকে সরিয়ে আবার যোগ করা হয়, @State ডিফল্ট মান দিয়ে পুনরায় আরম্ভ হয়। স্থায়ীত্বের জন্য, @AppStorage ব্যবহার করুন।
হ্যাঁ, পরিবর্তনটি withAnimation-এ মোড়ান: withAnimation(.easeInOut) { isExpanded.toggle() }. SwiftUI নির্দিষ্ট অ্যানিমেশন টাইপের সাথে পুরানো এবং নতুন ইন্টারফেস অবস্থার মধ্যে ট্রানজিশন অ্যানিমেট করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন