SwiftUIにおけるprojectedValueについて

この記事は約5分で読めます。

SwiftUIで使われるプロパティラッパーには、wrappedValueだけでなく、projectedValueというプロパティもあります。
projectedValueは、プロパティラッパーに追加の機能や情報を提供するために使用されます。
この記事では、projectedValueの基本的な使い方や具体例について詳しく解説します。

  • iOS:13.0以上
  • XCode(当サイトの環境):15.0.1

projectedValueとは?

projectedValueは、プロパティラッパーに追加の情報や機能を提供するためのプロパティです。
wrappedValueがラップされた値そのものを表すのに対し、projectedValueはその値に関連する追加の情報や動作を提供します。

例えば、@Bindingでは、projectedValue$記号を使ってアクセスするためのバインディングを提供します。

プロパティラッパーの基本構造

まず、基本的なプロパティラッパーの定義方法を見てみましょう。

@propertyWrapper
struct ExampleWrapper {
    var wrappedValue: Int
    var projectedValue: String {
        return "Projected Value: \(wrappedValue)"
    }
    init(wrappedValue: Int) {
        self.wrappedValue = wrappedValue
    }
}

この例では、ExampleWrapperというプロパティラッパーを定義しています。wrappedValueは整数値を保持し、projectedValueはその整数値に基づいて生成される文字列を提供します。

使用例

このプロパティラッパーを使ってみましょう。

import SwiftUI
struct ProjectedValueSmp: View {
    @ExampleWrapper var number: Int = 42
    var body: some View {
        VStack {
            Text("Wrapped Value: \(number)")
            Text("\($number)")
        }
    }
}

この例では、numberwrappedValueprojectedValueの両方にアクセスしています。

wrappedValueは整数値そのものであり、projectedValueはその整数値に基づく文字列です。

SwiftUIにおける実用例

SwiftUIでは、@Binding@StateObjectなどのプロパティラッパーがprojectedValueを利用して、追加の機能や情報を提供しています。

@Bindingの例

@Bindingプロパティラッパーは、親ビューと子ビュー間で値を共有するために使われます。projectedValueを使うことで、バインディングを簡単に渡すことができます。

import SwiftUI
struct ProjectedValueParentView: View {
    @State private var name: String = "John"
    var body: some View {
        ProjectedValueChildView(name: $name)
    }
}
struct ProjectedValueChildView: View {
    @Binding var name: String
    var body: some View {
        TextField("Enter name", text: $name)
    }
}

この例では、親ビューのnameプロパティが子ビューにバインディングとして渡されています。$name@BindingprojectedValueです。

@StateObjectの例

@StateObjectプロパティラッパーは、ビューのライフサイクルに基づいてオブジェクトを管理します。projectedValueを使うことで、オブジェクトのプロパティにバインディングすることができます。

import SwiftUI
class ViewModel: ObservableObject {
    @Published var text: String = "Hello"
}
struct ProjectedValueSmp: View {
    @StateObject private var viewModel = ViewModel()
    var body: some View {
        TextField("Enter text", text: $viewModel.text)
    }
}

この例では、viewModeltextプロパティにバインディングして、TextFieldに表示しています。$viewModel.textは、@PublishedprojectedValueです。

まとめ

projectedValueは、プロパティラッパーに追加の機能や情報を提供するための重要なプロパティです。SwiftUIでの使用例を通じて、その強力な機能を理解することができます。

@Binding@StateObjectなど、さまざまなプロパティラッパーでprojectedValueがどのように役立つかを知ることで、よりリッチで動的なUIを構築することが可能になります。

タイトルとURLをコピーしました