例によるSwiftUI(SwiftUI by Example)19 Appendix A

@GestureStateプロパティラッパーとは何ですか?
What is the @GestureState property wrapper?

SwiftUIは、ジェスチャの状態を追跡するための特定のプロパティラッパーを提供し@GestureStateます。単純な@Stateプロパティラッパーを使用して同じことを実現できますが@GestureState、ジェスチャが終了すると、プロパティを自動的に初期値に戻す機能が追加されています。

たとえば、ビューをドラッグできるジェスチャを作成したい場合があります。これを行うには、最初に、次の@GestureStateように、ビューが移動された量を格納するプロパティを作成する必要があります。

//--------------------------------------------
struct PrimaryLabel: ViewModifier {
    func body(content: Content) -> some View {
        content
            .padding()
            .background(Color.black)
            .foregroundColor(.white)
            .font(.largeTitle)
            .cornerRadius(10)
    }
}
//--------------------------------------------
struct ContentView: View {
    @GestureState var dragAmount = CGSize.zero
    
    var body: some View {
        Image("dokuro")
            .offset(dragAmount)
            .gesture(
                DragGesture().updating($dragAmount) { value, state, transaction in
                    state = value.translation
                }
            )
    }
}
//--------------------------------------------

@FetchRequestプロパティラッパーとは何ですか?
What is the @FetchRequest property wrapper?

@FetchRequest少なくとも2つの値を指定する必要があります。読み取りたいエンティティと、データを配置するための並べ替え記述子です。オプションで、必要に応じてデータをフィルタリングするための述語を提供することもできます。

@FetchRequestする前に、まずCore Data管理対象オブジェクトコンテキストを環境に挿入しておく必要があります。その方法については、↓
SwiftUIビューからCoreData管理対象オブジェクトコンテキストにアクセスする方法

データに並べ替えを適用しない

@FetchRequest(
    entity: User.entity(),
    sortDescriptors: []
) var users: FetchedResults<User>

データを並べ替える場合は、次のように、並べ替え記述子をキーパスの配列として指定します。
いくつでも提供でき、順番に評価されます。

@FetchRequest(
    entity: User.entity(), 
    sortDescriptors: [
        NSSortDescriptor(keyPath: \User.name, ascending: false)
    ]
) var users: FetchedResults<User>


述語も追加するには、次のNSPredicateような形式を使用して作成します。

@FetchRequest(
    entity: User.entity(),
    sortDescriptors: [
        NSSortDescriptor(keyPath: \User.name, ascending: false),
    ],
    predicate: NSPredicate(format: "surname == %@", "Hudson")
) var users: FetchedResults<User>

@AppStorageプロパティラッパーとは何ですか?
What is the @AppStorage property wrapper?

参考 別途 ウェブより

AppStorage is a property-wrapper around UserDefaults for SwiftUI.
AppStorageは、SwiftUIのUserDefaultsを囲むプロパティラッパーです。

iOS14の新機能

SwiftUIには、から値を読み取るための専用のプロパティラッパーがありUserDefaults、値が変更されると、ビューのbodyプロパティが自動的に再起動されます。つまり、このラッパーはのキーを効果的に監視し、UserDefaultsそのキーが変更された場合にUIを更新します。

たとえば、これはUserDefaults「ユーザー名」キーを監視します。このキーは、ボタンが押されたときに設定されます。

//--------------------------------------------
struct ContentView: View {
    @AppStorage("username") var username: String = "Anonymous"

    var body: some View {
        VStack {
            Text("Welcome, \(username)!")

            Button("Log in") {
                self.username = "@twostraws"
            }
        }
    }
}
//--------------------------------------------

@ScaledMetricプロパティラッパーとは何ですか?
What is the @ScaledMetric property wrapper?

iOS14の新機能

SwiftUIは@ScaledMetric、ユーザーの動的タイプ設定に従って自動的にスケーリングする数値を定義するためのプロパティラッパーを提供します。

最も基本的な使用法では、プロパティにデフォルト値を指定すると、残りの処理が実行されます。たとえば、これにより、ユーザーの設定に応じて異なるサイズで同じ画像が描画されます。

//--------------------------------------------
struct ContentView: View {
    //@ScaledMetric var imageSize: CGFloat = 200
    @ScaledMetric(relativeTo: .largeTitle) var imageSize: CGFloat = 100

    var body: some View {
        Image(systemName: "cloud.sun.bolt.fill")
            .resizable()
            .frame(width: imageSize, height: imageSize)
    }
}
//--------------------------------------------

特定の他のテキストと一致するようにスケーリングが必要な場合relativeToは、プロパティラッパーのパラメーターを使用して、一致するフォントサイズを指定できます。たとえば、これは大きなタイトルサイズと一緒に拡大縮小します。

@ScaledMetric(relativeTo: .largeTitle) var imageSize: CGFloat = 100

@StateObjectプロパティラッパーとは何ですか?
What is the @StateObject property wrapper?

iOS14の新機能

これUserにより、ビューが更新されたときにインスタンスが破棄されないようになります。

以前@ObservedObjectは同じ結果が得られていたかもしれませんが、それは危険@ObservedObjectでした。オブジェクトの最終的な信頼できる情報源となるように設計されていないため、保存していたオブジェクトを誤って解放することがありました。これはでは発生し@StateObjectないため、代わりに使用する必要があります。

//--------------------------------------------
class User: ObservableObject {
    var username = "@twostraws"
}
//--------------------------------------------
struct ContentView: View {
    @StateObject var user = User()

    var body: some View {
        Text("Username: \(user.username)")
    }
}
//--------------------------------------------

関連サイト
SwiftUIのProperty Wrappersとデータへのアクセス方法

@UIApplicationDelegateAdaptorプロパティラッパーとは何ですか?
What is the @UIApplicationDelegateAdaptor property wrapper?

iOS14の新機能

AppDelegateへのアクセスを取得する必要がある場合

class AppDelegate: NSObject, UIApplicationDelegate {
    // add app delegate methods here
}

@main
struct NewIn14App: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

@SceneStorageプロパティラッパーとは何ですか?
What is the @SceneStorage property wrapper?

iOS14の新機能

画面ごとに一意のデータを保存する場合は、SwiftUIの@SceneStorageプロパティラッパーを使用する必要があります。


struct ContentView: View {
    @SceneStorage("text") var text = ""

    var body: some View {
        NavigationView {
            TextEditor(text: $text)
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}