<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Dependency Injection (DI) in swift]]></title><description><![CDATA[Dependency Injection (DI) in swift]]></description><link>https://dependency-injection-di-in-swift.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 16:04:38 GMT</lastBuildDate><atom:link href="https://dependency-injection-di-in-swift.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The SwiftUI Guide to Clean State Management and Dependency Injection]]></title><description><![CDATA[Why Use @StateObject in the App File?
In SwiftUI, you use @StateObject when you want to create and manage a view model that your whole app will use.
What is @StateObject?
@StateObject is how you create and keep a view model (or any observable class) ...]]></description><link>https://dependency-injection-di-in-swift.hashnode.dev/the-swiftui-guide-to-clean-state-management-and-dependency-injection</link><guid isPermaLink="true">https://dependency-injection-di-in-swift.hashnode.dev/the-swiftui-guide-to-clean-state-management-and-dependency-injection</guid><category><![CDATA[@ObservedObject]]></category><category><![CDATA[SwiftUI Best Practices]]></category><category><![CDATA[SwiftUI]]></category><category><![CDATA[State Management ]]></category><category><![CDATA[EnvironmentObject]]></category><category><![CDATA[iOS development]]></category><category><![CDATA[ViewModel]]></category><category><![CDATA[dependency injection]]></category><dc:creator><![CDATA[Tabassum Akter Nusrat]]></dc:creator><pubDate>Wed, 02 Jul 2025 10:21:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/505eectW54k/upload/b7612b51aaa324906ffcc520e00992cb.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-why-use-stateobject-in-the-app-file">Why Use <code>@StateObject</code> in the App File?</h3>
<p>In SwiftUI, you use <code>@StateObject</code> when you want to <strong>create and manage</strong> a view model that your whole app will use.</p>
<h3 id="heading-what-is-stateobject">What is <code>@StateObject</code>?</h3>
<p><code>@StateObject</code> is how you <strong>create and keep</strong> a view model (or any observable class) in SwiftUI.</p>
<p>SwiftUI will <strong>watch it for changes</strong>, and <strong>automatically update the UI</strong> when something inside it changes.</p>
<p>It makes sure the view model is only <strong>created once and stays alive</strong> as long as the app runs.</p>
<h3 id="heading-example"><strong>Example</strong></h3>
<h3 id="heading-viewmodel-as-observableobject">ViewModel as ObservableObject</h3>
<p>SwiftUI watches <code>ObservableObject</code> for changes and updates the view.</p>
<pre><code class="lang-swift"><span class="hljs-keyword">import</span> SwiftUI
<span class="hljs-keyword">import</span> Combine

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyViewModel</span>: <span class="hljs-title">ObservableObject</span> </span>{
    @<span class="hljs-type">Published</span> <span class="hljs-keyword">var</span> counter: <span class="hljs-type">Int</span> = <span class="hljs-number">0</span>

    <span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">increment</span><span class="hljs-params">()</span></span> {
        counter += <span class="hljs-number">1</span>
    }
}
</code></pre>
<p>with <strong><em>@StateObject</em></strong> SwiftUI will <strong>watch it for changes</strong>, and <strong>automatically update the UI</strong></p>
<p>Don't pass state — inject it with <strong>.<em>environmentObject()</em>"</strong></p>
<pre><code class="lang-swift">@main
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">MyApp</span>: <span class="hljs-title">App</span> </span>{
    @<span class="hljs-type">StateObject</span> <span class="hljs-keyword">private</span> <span class="hljs-keyword">var</span> viewModel = <span class="hljs-type">MyViewModel</span>()

    <span class="hljs-keyword">var</span> body: some <span class="hljs-type">Scene</span> {
        <span class="hljs-type">WindowGroup</span> {
            <span class="hljs-type">ContentView</span>()
                .environmentObject(viewModel) <span class="hljs-comment">// Inject into environment</span>
        }
    }
}
</code></pre>
<p>All views using <code>@EnvironmentObject</code> automatically access the <strong>same shared data</strong> injected in the App file.</p>
<pre><code class="lang-swift"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">ContentView</span>: <span class="hljs-title">View</span> </span>{
    @<span class="hljs-type">EnvironmentObject</span> <span class="hljs-keyword">var</span> viewModel: <span class="hljs-type">MyViewModel</span>

    <span class="hljs-keyword">var</span> body: some <span class="hljs-type">View</span> {
        <span class="hljs-type">VStack</span> {
            <span class="hljs-type">Text</span>(<span class="hljs-string">"Counter: \(viewModel.counter)"</span>)
            <span class="hljs-type">Button</span>(<span class="hljs-string">"Increment"</span>) {
                viewModel.increment()
            }
        }
    }
}
</code></pre>
<h3 id="heading-observedobject-vs-stateobject">@ObservedObject Vs @StateObject</h3>
<h3 id="heading-passing-state-with-observedobject">Passing State with <code>@ObservedObject</code></h3>
<p>You manually pass the view model to each view that needs it:</p>
<pre><code class="lang-swift">@main
<span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">MyApp</span>: <span class="hljs-title">App</span> </span>{
    <span class="hljs-keyword">var</span> body: some <span class="hljs-type">Scene</span> {
        <span class="hljs-type">WindowGroup</span> {
            <span class="hljs-comment">// Manually create and pass the view model</span>
            <span class="hljs-type">ContentView</span>(viewModel: <span class="hljs-type">MyViewModel</span>())
        }
    }
}
</code></pre>
<pre><code class="lang-swift"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">ContentView</span>: <span class="hljs-title">View</span> </span>{
    @<span class="hljs-type">ObservedObject</span> <span class="hljs-keyword">var</span> viewModel: <span class="hljs-type">MyViewModel</span>

    <span class="hljs-keyword">var</span> body: some <span class="hljs-type">View</span> {
        <span class="hljs-type">Text</span>(<span class="hljs-string">"Count: \(viewModel.counter)"</span>)
    }
}
</code></pre>
<p><strong>By</strong> <code>@ObservedObject</code>, the App file creates the <strong>view model and passes it directly</strong> to <code>ContentView</code>.<br /><strong>By</strong> <code>@EnvironmentObject</code>, the App file injects the view model into the environment, and <code>ContentView</code> accesses it automatically.</p>
<p>Don’t pass state – inject it with <code>.environmentObject()</code> — own it, share it, and keep your SwiftUI clean.</p>
]]></content:encoded></item></channel></rss>