【SwiftUI + SwiftData】@Query とは? - MV (Model + View) Pattern

C も P も VM もないんですね!

【SwiftUI + SwiftData】@Query とは? - MV Pattern ( Model + View )

「@Query」を基本的に、どう理解しておくか。


import SwiftUI

// Model
struct Product {

  static var all: [Product] { get async }
}

// View
struct ProductList: View {
  @State private var products: [Product] = []

  var body: some View {
    VStack {

    }
    .task {
      products = await Product.all
    }
  }
}

SwiftData を使うと以下のように書ける。


import SwiftUI
import SwiftData

// Model
struct Product {

}

// View
struct ProductList: View {
  @Query private var products: [Product]

  var body: some View {
    VStack {

    }
  }
}

「モデルデータコレクションの非同期取得」 ですね。

@State と同様に変更を監視しています。

👉 Stop using MVVM for SwiftUI | Apple Developer Forums hatena-bookmark


【#SwiftUI】レイアウトの調整に View.background(Color.*) が便利だな

もっと、いい方法があれば教えてほしいです。

連続する Modifirer の中で

パディング、マージンの調整に便利かも、

という発想。

視覚的に把握できるの便利。

View Debugger で見るより実はシンプルで速い。



慣れてしまえばどうでもいい話かな。


【SwiftUI】View プロパティの記述

これ、みんなフツーに書いてるけど。

これだけ。


struct ToggleView: View {
  @State var isOn = true

  var body: some View {
    Toggle(isOn ? "ON" : "OFF", isOn: $isOn)
  }
}

スゴイよね、SwiftUI。

 

📱 プロパティの記述

これよ。


@State var isOn = true

プロパティの記述をざっくり考えると、


[@State] [public|private] {let|var} isOn[: Bool] [= true]

となり、数十通りあるのに!

いくつか書き出して試してみます。


let isOn: Bool
let isOn: Bool = true
var isOn: Bool 
var isOn: Bool = true
private let isOn: Bool
private let isOn: Bool = true
private var isOn: Bool 
private var isOn: Bool = true
@State let isOn: Bool
@State let isOn: Bool = true
@State var isOn: Bool 
@State var isOn: Bool = true 
@State private let isOn: Bool
@State private let isOn: Bool = true
@State private var isOn: Bool 
@State private var isOn: Bool = true

 

📱 結果


// Cannot find '$isOn' in scope

let isOn: Bool
let isOn: Bool = true
var isOn: Bool 
var isOn: Bool = true
private let isOn: Bool
private let isOn: Bool = true
private var isOn: Bool 
private var isOn: Bool = true

→ Toggle() の2番目の引数 $isOn が見つからない。


// Property wrapper can only be applied to a 'var'

@State let isOn: Bool
@State let isOn: Bool = true
@State private let isOn: Bool
@State private let isOn: Bool = true

→ @State には var しか使えない。


// Missing argument for parameter 'isOn' in call

@State var isOn: Bool

→ isOn の中身がない。


// Missing argument for parameter 'isOn' in call
// 'ToggleView' initializer is inaccessible due to 'private' protection level

@State private var isOn: Bool

→ isOn の中身がない。
→ private なのでイニシャライザーがアクセスできません。


// OK

@State var isOn: Bool = true
@State private var isOn: Bool = true

→ OK

 

📱 まとめ

Property wrapper は var 。

中身が変わるからかな。