SwiftUI — WWDC 2019 में प्रस्तुत, Apple का सभी इकोसिस्टम प्लेटफ़ॉर्म पर यूज़र इंटरफ़ेस बनाने के लिए डिक्लेरेटिव फ्रेमवर्क। इम्पेरेटिव UIKit और इसके viewDidLoad व मैन्युअल स्क्रीन अपडेट के विपरीत, SwiftUI UI को View प्रोटोकॉल का पालन करने वाली सरल संरचनाओं के संग्रह के रूप में वर्णित करता है। Swift.org (2025) के अनुसार, App Store पर प्रकाशित 65% नए प्रोजेक्ट्स में SwiftUI का उपयोग किया जाता है। फ्रेमवर्क State और Data Flow तंत्र के माध्यम से स्वचालित रूप से इंटरफ़ेस अपडेट का प्रबंधन करता है — जब डेटा बदलता है, View मैन्युअल reloadData कॉल के बिना पुनः चित्रित होता है।
मुख्य बिंदु
SwiftUI — Apple का डिक्लेरेटिव UI फ्रेमवर्क, जो UIKit से मौलिक रूप से भिन्न है। कंट्रोलर, व्यू बनाने और उनके जीवनचक्र को मैन्युअल रूप से प्रबंधित करने के बजाय, डेवलपर इंटरफ़ेस को घोषणाओं के रूप में वर्णित करता है: स्क्रीन पर क्या होना चाहिए, न कि इसे कैसे बनाना है। SwiftUI प्रतिक्रियाशीलता के सिद्धांत पर आधारित है: इंटरफ़ेस स्थिति का एक फ़ंक्शन है। जब स्थिति बदलती है, SwiftUI स्वचालित रूप से सभी आश्रित Views के body की पुनर्गणना करता है और स्क्रीन के केवल बदले हुए भागों को अपडेट करता है। SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ और visionOS 1+ पर उपलब्ध है। SwiftUI कोड क्रॉस-प्लेटफ़ॉर्म है: एक फ़ाइल iPhone, iPad, Mac और Apple Watch पर न्यूनतम प्लेटफ़ॉर्म अनुकूलन के साथ काम करती है। Apple WWDC Session 101 (2024) के अनुसार, SwiftUI App Store के 90% से अधिक मानक UI पैटर्न को कवर करता है।
UIKit — इम्पेरेटिव फ्रेमवर्क (2008): डेवलपर UIViewController बनाता है, viewDidLoad में subviews कॉन्फ़िगर करता है, UITableView के लिए delegate/datasource लागू करता है और reloadData या setNeedsLayout के माध्यम से स्क्रीन अपडेट करता है। SwiftUI कंट्रोलर को सरल View संरचनाओं, डेलीगेट को bindings और onChange, Auto Layout को HStack/VStack/ZStack और मॉडिफ़ायर (padding, frame, offset) से बदलता है। UIKit को ARC के माध्यम से मैन्युअल मेमोरी प्रबंधन की आवश्यकता होती है; SwiftUI संरचनाओं का उपयोग करता है जिन्हें संदर्भ गणना की आवश्यकता नहीं होती। SwiftUI का प्रदर्शन UIKit के बराबर है: फ्रेमवर्क न्यूनतम परिवर्तन सेट के लिए diffing एल्गोरिदम का उपयोग करता है। IT Sectr में, SwiftUI का उपयोग iOS 17+ लक्ष्य वाले नए प्रोजेक्ट्स के लिए किया जाता है; iOS 14–15 समर्थन वाले प्रोजेक्ट्स को सीमित SwiftUI संगतता के कारण UIKit की आवश्यकता होती है।
SwiftUI में, इंटरफ़ेस ViewBuilder — एक result builder के माध्यम से वर्णित किया जाता है जो Views के सेट को tuple या Group में बदलता है। मॉडिफ़ायर (.padding(), .font(), .foregroundColor()) मूल ऑब्जेक्ट को बदलने के बजाय संशोधित सेटिंग्स के साथ नई Views बनाते हैं। प्रत्येक मॉडिफ़ायर एक नई View लौटाता है, जिससे चेनिंग संभव होती है। ViewBuilder if/else, switch, ForEach का समर्थन करता है — बिना अलग कंट्रोलर के सशर्त और चक्रीय रेंडरिंग। SwiftUI में View एक value type (struct) है, जो पूर्वानुमेय व्यवहार सुनिश्चित करता है और race conditions को समाप्त करता है।
View — एक प्रोटोकॉल जिसमें एकमात्र आवश्यकता है: some View प्रकार की computed property body। View का पालन करने वाली प्रत्येक संरचना body में स्क्रीन का अपना भाग वर्णित करती है। some View प्रकार एक अपारदर्शी रिटर्न प्रकार है जो लौटाई गई View के ठोस प्रकार को छुपाता है (VStack, HStack, ZStack, Text, Image आदि का स्टैकिंग)। Swift कंपाइलर कंपाइल समय पर ठोस प्रकार का अनुमान लगाता है, टाइप इरेज़र के बिना सीधी कॉल का प्रदर्शन बनाए रखता है।
import SwiftUI
struct GreetingView: View {
var name: String
var body: some View {
VStack(spacing: 12) {
Text("नमस्ते, \(name)!")
.font(.largeTitle)
.foregroundColor(.primary)
Text("SwiftUI में आपका स्वागत है")
.font(.body)
.foregroundColor(.secondary)
}
.padding()
.background(
RoundedRectangle(cornerRadius: 12)
.fill(.ultraThinMaterial)
)
}
}GreetingView संरचना एक name पैरामीटर लेती है और एक ऊर्ध्वाधर स्टैक में दो टेक्स्ट ब्लॉक प्रदर्शित करती है। मॉडिफ़ायर .font, .foregroundColor, .padding और .background स्वरूप कॉन्फ़िगर करते हैं। SwiftUI हर बार इनपुट पैरामीटर (name) बदलने पर body को कॉल करता है — पुनः चित्रण केवल बदले हुए भागों के लिए होता है। उदाहरण SwiftUI में निर्मित मूल blur पृष्ठभूमि RoundedRectangle का .ultraThinMaterial के साथ उपयोग करता है।
@State — एक property wrapper जो एकल View से संबंधित स्थानीय स्थिति घोषित करता है। SwiftUI State मेमोरी को स्वचालित रूप से प्रबंधित करता है: जब मान बदलता है, body पुनः चित्रित होता है, लेकिन केवल उन Views के लिए जो उस State का उपयोग करती हैं। State सरल प्रकारों (String, Int, Bool, enum) के लिए source of truth है। जटिल डेटा मॉडल के लिए @State का उपयोग न करें — इसके बजाय @StateObject और @ObservedObject का उपयोग करें। State प्राइवेट होना चाहिए और View के भीतर ही संग्रहीत होना चाहिए, घटकों के बीच पारित नहीं होना चाहिए।
import SwiftUI
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack(spacing: 20) {
Text("गणना: \(count)")
.font(.system(size: 48, weight: .bold))
Button(action: { count += 1 }) {
Label("बढ़ाएँ", systemImage: "plus.circle")
}
.buttonStyle(.borderedProminent)
}
.padding()
}
}प्रारंभिक count मान = 0। प्रत्येक बटन दबाने पर count बढ़ता है; SwiftUI पूरे CounterView (सभी Views) को स्वचालित रूप से पुनः चित्रित करता है। UIKit में, समान परिदृश्य के लिए IBOutlet, IBAction और मैन्युअल label.text अपडेट की आवश्यकता होती। @State सुनिश्चित करता है कि View केवल विशिष्ट State बदलने पर पुनः चित्रित हो — SwiftUI का diffing एल्गोरिदम ट्री में न्यूनतम परिवर्तन ढूँढता है।
@Binding — एक property wrapper जो View और उस डेटा के बीच दो-तरफ़ा संबंध बनाता है जिसका View स्वामी नहीं है। Binding, State (या अन्य source of truth) का एक संदर्भ है, जो चाइल्ड View को पैरेंट में संग्रहीत मान को पढ़ने और बदलने की अनुमति देता है। Binding को $ उपसर्ग से दर्शाया जाता है: $count चाइल्ड View को Binding<Int> पास करता है। Binding के बिना, चाइल्ड View पैरेंट के डेटा को बदल नहीं सकता — केवल पढ़ सकता है।
import SwiftUI
struct StepperControl: View {
@Binding var value: Int
let range: ClosedRange<Int>
var body: some View {
HStack {
Button(action: { if value > range.lowerBound { value -= 1 } }) {
Image(systemName: "minus.circle")
}
Text("\(value)")
.frame(minWidth: 40)
Button(action: { if value < range.upperBound { value += 1 } }) {
Image(systemName: "plus.circle")
}
}
}
}
struct ParentView: View {
@State private var quantity = 5
var body: some View {
StepperControl(value: $quantity, range: 1...10)
}
}ParentView State quantity का स्वामी है और $quantity के माध्यम से Binding पास करता है। StepperControl मान बदल सकता है, और पैरेंट में quantity स्वचालित रूप से सिंक हो जाती है। Binding डेटा की प्रतिलिपि नहीं है, बल्कि source of truth का पुल है। कस्टम कंट्रोल, एडिटर और पुन: प्रयोज्य घटकों के लिए @Binding का उपयोग करें जिन्हें पैरेंट के डेटा को बदलने की आवश्यकता होती है।
@StateObject — ObservableObject का पालन करने वाले क्लास के इंस्टेंस को बनाने और उसका स्वामित्व लेने के लिए property wrapper। View एक बार जीवनचक्र में ऑब्जेक्ट बनाती है और इसके @Published गुण बदलने पर पुनः चित्रित होती है। @ObservedObject — समान wrapper, लेकिन View ऑब्जेक्ट का स्वामी नहीं है — ऑब्जेक्ट View के बाहर बनाया और संग्रहीत किया जाता है (इनिशियलाइज़र के माध्यम से पास किया जाता है)। Apple View पदानुक्रम में source of truth के लिए @StateObject और निर्भरता इंजेक्शन के लिए @ObservedObject की अनुशंसा करता है।
import SwiftUI
import Combine
class UserSettings: ObservableObject {
@Published var username: String = "Guest"
@Published var isLoggedIn = false
}
struct ProfileView: View {
@StateObject private var settings = UserSettings()
var body: some View {
VStack {
TextField("Username", text: $settings.username)
.textFieldStyle(.roundedBorder)
Toggle("Logged In", isOn: $settings.isLoggedIn)
if settings.isLoggedIn {
Text("\(settings.username), आपका स्वागत है!")
.font(.headline)
}
}
.padding()
}
}UserSettings — दो @Published गुणों वाला ObservableObject। ProfileView @StateObject के माध्यम से ऑब्जेक्ट का स्वामी है। username या isLoggedIn में परिवर्तन स्वचालित रूप से ProfileView को पुनः चित्रित करते हैं। @Published SwiftUI को परिवर्तनों के बारे में सूचित करने के लिए Combine Publisher का उपयोग करता है। चाइल्ड Views में settings पास करने के लिए @ObservedObject का उपयोग करें:
Apple SwiftUI में Data Flow के चार स्तर परिभाषित करता है: @State (स्थानीय, value type), @Binding (दो-तरफ़ा), @StateObject/@ObservedObject (ObservableObject के साथ reference type), @EnvironmentObject (वैश्विक, पर्यावरण के माध्यम से इंजेक्ट)। EnvironmentObject इनिशियलाइज़र में स्पष्ट पासिंग के बिना पूरे View पदानुक्रम में डेटा पास करने की अनुमति देता है। इसके अतिरिक्त, @AppStorage UserDefaults के साथ काम करता है, @SceneStorage सीन स्थिति के साथ, @FetchRequest Core Data के साथ। Data Flow स्तर का चुनाव एप्लिकेशन आर्किटेक्चर निर्धारित करता है: सरल स्क्रीन State/Binding का उपयोग करती हैं, मॉड्यूलर ObservedObject का, बड़े पैमाने पर EnvironmentObject + Redux-जैसे समाधान (TCA, Composable Architecture) का।
| Property Wrapper | स्वामित्व | प्रकार | कब उपयोग करें |
|---|---|---|---|
| @State | स्थानीय | Value (struct, enum) | एकल View की सरल स्थिति (काउंटर, टॉगल, टेक्स्ट फ़ील्ड) |
| @Binding | बाहरी | State का संदर्भ | चाइल्ड View पैरेंट के डेटा को बदल रही है |
| @StateObject | View स्वामित्व | Reference (class) | जटिल डेटा मॉडल के लिए source of truth |
| @ObservedObject | इंजेक्शन | Reference (class) | View के बाहर बनाया गया मॉडल (init के माध्यम से पास) |
| @EnvironmentObject | वैश्विक | Reference (class) | पूरे पदानुक्रम के लिए उपलब्ध डेटा (auth, theme) |
अक्सर पूछे जाने वाले प्रश्न
@State — value types (struct, enum, String, Int) और एकल View की स्थानीय स्थिति के लिए। SwiftUI State मेमोरी को स्वचालित रूप से प्रबंधित करता है। @StateObject — ObservableObject का पालन करने वाले reference types (class) के लिए। @StateObject ऑब्जेक्ट का स्वामी होता है और @Published गुण बदलने पर View को पुनः चित्रित करता है। सरल काउंटर के लिए @State का उपयोग करें; व्यावसायिक तर्क वाले मॉडल के लिए @StateObject का उपयोग करें।
हाँ, SwiftUI UIHostingController (UIKit के अंदर SwiftUI) और UIViewRepresentable (SwiftUI के अंदर UIKit) के माध्यम से UIKit के साथ एकीकृत होता है। UIHostingController SwiftUI View को UIViewController में लपेटता है। UIViewRepresentable SwiftUI में UIKit घटकों (MKMapView, WKWebView) का उपयोग करने की अनुमति देता है। UIKit से SwiftUI में प्रोजेक्ट माइग्रेट करने का यह मानक तरीका है।
ViewBuilder — एक result builder (Swift 5.1) जो Views के सेट को TupleView, Group या ConditionalContent प्रकार के एकल मान में बदलता है। ViewBuilder डिक्लेरेटिव body के अंदर इम्पेरेटिव if/else और switch लिखने की अनुमति देता है। ViewBuilder के बिना आपको प्रत्येक सशर्त ब्लॉक के लिए AnyView या Group लौटाना होता। ViewBuilder ही कारण है कि body में Views के बीच अल्पविराम की आवश्यकता नहीं है।
हाँ, SwiftUI iOS 13+, iPadOS 13+, macOS 10.15+, watchOS 6+, tvOS 13+ और visionOS 1+ का समर्थन करता है। हालांकि, कुछ API केवल नए संस्करणों पर उपलब्ध हैं: उदाहरण के लिए, navigationStack (iOS 16+), Observable macro (iOS 17+)। पिछड़ी संगतता के लिए #available और UIKit अनुकूलन का उपयोग करें।
Xcode Debug View Hierarchy मॉडिफ़ायर और फ़्रेम के साथ SwiftUI View ट्री दिखाता है। SwiftUI Inspector उपकरण (Xcode दायाँ पैनल) वास्तविक समय में मॉडिफ़ायर बदलने की अनुमति देता है। body में self._printChanges() पुनः चित्रण के कारणों को लॉग करता है। SwiftUI टेम्पलेट के साथ Instruments View प्रदर्शन को ट्रेस करता है और अत्यधिक पुनः चित्रण की पहचान करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।