【iOS/Xcode】Single Source of Truth(SSOT)とは?Swift UIで理解する
この記事からわかること
- Swift/iOSアプリの設計
- Single Source of Truth(SSOT)とは?
index
[open]
\ アプリをリリースしました /
環境
- Xcode:26.0.1
- iOS:26
- Swift:6
- macOS:Tahoe 26.0.1
Single Source of Truth(SSOT)とは?
「Single Source of Truth(SSOT)」はデータが1箇所のみで管理されるようにする設計思想の1つです。日本語に訳すと「信頼できる唯一の情報源」という意味になります。これはデータの生成や参照を一元管理することでデータの不整合や重複等を防ぐための思想になっています。
ここで話してきたデータをもう少し具体に落とし込むと「状態(State)」になります。状態とは実際に画面の見た目や挙動に影響を与える値だと思ってもらえれば大丈夫です。例えばユーザー名を表示するための文字列やログイン状態によってUIが切り替わるようにするためのログインフラグ(Bool値)などが該当します。
var userName: String = "none"
var isLogin: Bool = false
またSSOTに則った実装イメージとしてデータの渡し方も例に上がるかなと思います。よくあるのが一覧画面から詳細画面に遷移するような実装です。この場合方法として「オブジェクト自体を渡す」or「オブジェクトのIDだ渡し再度データソースからフェッチする」の2パターンあると思います。この場合2つ目の方がSSOTに則った実装になるのかなと思います。実装方針に関してはどちらが正解ということもないと思うのでプロジェクトに合う方を選べば良いとは思います。
/// 「オブジェクト自体を渡す」
struct ArticleDetailView: View {
let article: Article
var body: some View {
Text(article.title)
}
}
/// 「オブジェクトのIDだ渡し再度データソースからフェッチする」
/// SSOTに則った実装
struct ArticleDetailView: View {
@EnvironmentObject var store: ArticleStore
let articleId: Int
var body: some View {
Group {
if let detail = store.details[articleId] {
Text(detail.title)
} else {
ProgressView()
}
}
.task {
await store.loadDetail(id: articleId)
}
}
}
@MainActor
final class ArticleStore: ObservableObject {
@Published var details: [Int: ArticleDetail] = [:]
func loadDetail(id: Int) async {
guard details[id] == nil else { return }
details[id] = await api.fetchDetail(id)
}
}
状態駆動のSwift UI
Swift UIは状態駆動でUIが更新されるUIフレームワークです。従来のUIKitでは値を置き換えたり、テーブルをリロードさせたりとUIの再構築には明示的な実装が必要でした。しかしSwift UIでは値(状態)が変化するとUIが再構築されるような仕組みになっていることで明示的に開発者が更新の仕組みを実装しなくても済むようになっています。
そのためSwift UIでは「Single Source of Truth(SSOT)」の原則が重要になってきます。状態の整合性が破綻すると、UIの表示も簡単に破綻してしまいます。それを防ぐための「状態管理」の手段としてSwift UIではいくつかのProperty Wrapperが用意されています。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。





