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

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)")
}
}
}この例では、numberのwrappedValueとprojectedValueの両方にアクセスしています。
wrappedValueは整数値そのものであり、projectedValueはその整数値に基づく文字列です。
SwiftUIにおける実用例
SwiftUIでは、@Bindingや@などのプロパティラッパーがStateObjectprojectedValueを利用して、追加の機能や情報を提供しています。
@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は@BindingのprojectedValueです。
@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)
}
}
この例では、viewModelのtextプロパティにバインディングして、TextFieldに表示しています。$viewModel.textは、@PublishedのprojectedValueです。
まとめ
projectedValueは、プロパティラッパーに追加の機能や情報を提供するための重要なプロパティです。SwiftUIでの使用例を通じて、その強力な機能を理解することができます。
@Bindingや@StateObjectなど、さまざまなプロパティラッパーでprojectedValueがどのように役立つかを知ることで、よりリッチで動的なUIを構築することが可能になります。

