<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SwiftData &#8211; 隨心所欲</title>
	<atom:link href="https://doeverythingiwant.com/tag/swiftdata/feed/" rel="self" type="application/rss+xml" />
	<link>https://doeverythingiwant.com</link>
	<description>iOS Developer 的隨筆記錄</description>
	<lastBuildDate>Mon, 20 Nov 2023 14:59:17 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.1</generator>

<image>
	<url>https://doeverythingiwant.com/wp-content/uploads/2025/08/cropped-0802.png</url>
	<title>SwiftData &#8211; 隨心所欲</title>
	<link>https://doeverythingiwant.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>從零開始學SwiftData</title>
		<link>https://doeverythingiwant.com/learningswiftdata/</link>
					<comments>https://doeverythingiwant.com/learningswiftdata/#respond</comments>
		
		<dc:creator><![CDATA[艾普利]]></dc:creator>
		<pubDate>Tue, 10 Oct 2023 02:31:00 +0000</pubDate>
				<category><![CDATA[寫程式]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[SwiftData]]></category>
		<guid isPermaLink="false">https://doeverythingiwant.com/?p=2112</guid>

					<description><![CDATA[Photo by Nathan da Silva on Un&#8230;]]></description>
										<content:encoded><![CDATA[
<p class="has-text-align-center wp-block-paragraph">Photo by <a href="https://unsplash.com/@silvawebdesigns?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash" target="_blank" rel="noopener">Nathan da Silva</a> on <a href="https://unsplash.com/photos/k-rKfqSm4L4?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash" target="_blank" rel="noopener">Unsplash</a></p>



<p class="wp-block-paragraph">WWDC23 中發表了一個新的Framework &#8211; SwiftData，它是本機端資料儲存方式之一，過去若想用DB方式將資料存在本機端最常用的就二種，一是iOS本家的Core Data，另一個就是第三方工具的SQLite，Core Data 雖然很好用，但是前置作業非常麻煩，設定完之後一定不會記得，所以SQLite看起來比較多人喜歡。</p>



<p class="wp-block-paragraph">然而SwiftData 簡化了非常多Core Data 需要做的事情，讓資料儲存變得非常簡單，當然也完全支援SwiftUI，這樣的東西怎麼可以不學起來呢?</p>



<p class="wp-block-paragraph">本篇主要會使用Apple 與 AppCoda 的教學來學習</p>



<span id="more-2112"></span>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">想要使用SwiftData 需要使用 <strong>Xcode15 &amp; iOS 17</strong> 才行</p>



<p class="wp-block-paragraph">本篇的參考教學文章在此</p>



<p class="wp-block-paragraph">Apple</p>



<ul class="wp-block-list">
<li><a href="https://developer.apple.com/videos/play/wwdc2023/10154/" target="_blank" rel="noreferrer noopener">WWDC23 Build an app with SwiftData</a></li>



<li>Sample code <a href="https://developer.apple.com/documentation/SwiftUI/Building-a-document-based-app-using-SwiftData" target="_blank" rel="noreferrer noopener">Building a document-based app using SwiftData</a></li>
</ul>



<p class="wp-block-paragraph">AppCoda</p>



<ul class="wp-block-list">
<li><a href="https://www.appcoda.com/swiftdata/" target="_blank" rel="noreferrer noopener">Getting Started with SwiftData for SwiftUI Development</a></li>
</ul>



<p class="wp-block-paragraph">本文章的程式碼多數來自於Apple的 Sample code</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">SwiftData 是和Core Data 一樣可以讓你將資料儲存在本機端中，它特別的地方在於可以直接將寫好的DataModel 變成是儲存的物件且寫法非常簡單，首先需要寫好一個DataModel，請注意必需要使用Class 才行</p>



<h2 class="wp-block-heading">建立Model</h2>



<p class="wp-block-paragraph">若是下載原本的Sample code 的話配合WWDC23的影片一起學習會比較好喔，我是直接抓重點來說，借用在 Building a document-based app using SwiftData 的範例中的 Card DataModel</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift" data-show-lang="1"><code>final class Card {
    var front: String
    var back: String
    var creationDate: Date

    init(front: String, back: String, creationDate: Date = .now) {
        self.front = front
        self.back = back
        self.creationDate = creationDate
    }
}</code></pre></div>



<p class="wp-block-paragraph">若要把這個Card 變成 SwiftData 的 Model的話，只要做二個步驟</p>



<p class="wp-block-paragraph">第一是<strong> import SwiftData</strong></p>



<p class="wp-block-paragraph">第二是在 Class 加上 <strong>@Model</strong></p>



<p class="wp-block-paragraph">好，完工</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>import SwiftData

@Model
final class Card {
    var front: String
    var back: String
    var creationDate: Date

    init(front: String, back: String, creationDate: Date = .now) {
        self.front = front
        self.back = back
        self.creationDate = creationDate
    }
}</code></pre></div>



<p class="wp-block-paragraph">沒錯，就是這麼簡單! 如果想要設定 Unique Key 例如像是 ID 之類的，當然可以設定，只要在參數前面加上 <code>@Attribute(.unique)</code> 就行了</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>@Model
final class Card {
    @Attribute(.unique) var cardId: String
    ...
}</code></pre></div>



<p class="wp-block-paragraph">還有一個比較特別的寫法是，如果哪天想要為這個參數變更名字，又不想要讓這個參數變成是一個新的參數，可以使用 <code>@Attribute(originalName:)</code>，這樣它就會自動對應到過去的名稱</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>@Model
final class Card {
    @Attribute(originalName: &quot;creationDate&quot;) var creation_Date: Date
    ...
}</code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">在SwiftUI 上使用</h2>



<p class="wp-block-paragraph">接著說明怎麼串接到 SwiftUI 的畫面裡，先找到有 <code>@main</code> 的檔案，在 <code>ContentView()</code> 下加上</p>



<p class="wp-block-paragraph"><code>.modelContainer(for: Card.self)</code>，modelContainer 記得先前在使用Core Data 的時候也有類似的設定，這裡是把想要做為SwiftData 的model 在 for: 後面，當然可以寫很多個用Array 形式來寫</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>import SwiftUI
import SwiftData

@main
struct SwiftDataFlashCardSample: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .modelContainer(for: Card.self)
        }
    }
}</code></pre></div>



<p class="wp-block-paragraph">接著在需要使用SwiftData 的View 上宣告 modelContext ，這就是用來做新增與刪除，再來就是要做Query ，只要宣告要使用的參數，這裡是 <code>var cards: [Card]</code>，在最前面的地方寫上 <code>@Query</code> 就完成了，</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>import SwiftData
struct ContentView: View {
    @Environment(\.modelContext) private var modelContext
    @Query private var cards: [Card]
    ...
}</code></pre></div>



<p class="wp-block-paragraph">也可以在Query 的時候加上 Sort 或 Filter</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>@Query(sort: \.creationData) private var cards: [Card]
@Query(filter: #Predicate&lt;Person&gt; { Person in $0.name == &quot;John&quot; }) private var persons: [Person]</code></pre></div>



<p class="wp-block-paragraph">加上 <code>@Query</code> 的參數就會自動追蹤變化，在參數有變更的時候自動更新畫面，所以並不需要特別做什麼處理。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">資料操作</h2>



<p class="wp-block-paragraph">接著來說操作，資料操作主要的就是三個動作，新增(insert)、修改(update)與刪除(Delete)</p>



<h2 class="wp-block-heading">Insert</h2>



<p class="wp-block-paragraph">Insert 的時候要使用到先前宣告過的 modelContext，呼叫 insert 的 function 即可</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>let newCard = Card(front: &quot;Sample Front&quot;, back: &quot;Sample Back&quot;)
modelContext.insert(newCard)</code></pre></div>



<h2 class="wp-block-heading">Update</h2>



<p class="wp-block-paragraph">其實寫上 <code>@Model</code> 的 Data Object，SwiftData 就會自動追蹤參數變化，只要是已經有新增過的 Item 不需要特別寫些什麼，SwiftData 就會自動去更新它的參數內容</p>



<h2 class="wp-block-heading">Delete </h2>



<p class="wp-block-paragraph">Delete 的時候和 Insert 一樣，可以告訴它想刪除的item 是那一個，也可以寫條件刪除</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-swift" data-lang="Swift"><code>let card = Cards[0]
modelContext.delete(card)</code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">目前感覺SwiftData 比起Core Data 來說簡單很多，不過畢竟 SwiftData 才剛推出，功能就沒有 Core Data強大，就如同SwiftUI 剛推出的時候一樣，有很多UIKit 很容易做到的事情，SwiftUI 還沒有支援，相信之後SwiftData 功能會慢慢變多，就等它未來發展啦</p>



<p class="wp-block-paragraph">最後祝大家 Coding 愉快!!</p>



<p class="wp-block-paragraph">可以在<a href="https://github.com/AprilXMoon/Todolist" target="_blank" rel="noreferrer noopener">這裡</a>下載我依照 AppCoda 教學做出的Sample code</p>
]]></content:encoded>
					
					<wfw:commentRss>https://doeverythingiwant.com/learningswiftdata/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
