Swiftの書き方(プロパティラッパー)

エンジニア

Swiftというプログラミング言語の書き方についてのまとめサイトになります。
これからiPhoneやMac向けのアプリケーション開発に挑戦したい!という人の助けになれればと思います。

プロパティラッパーとは

プロパティの振る舞いを簡潔に定義するための仕組みです。プロパティラッパーを使用すると、同じ振る舞いを持つプロパティを再利用でき、コードの重複を削減することができます。
プロパティラッパーは、@propertyWrapper 属性を付けた構造体やクラスを作成することで定義されます。そして、プロパティにそのラッパーを適用することで、プロパティに新しい振る舞いや追加の機能を追加することができます。

@propertyWrapper
struct MyWrapper {
    private var value: Int

    init(initialValue: Int) {
        self.value = initialValue
    }

    var wrappedValue: Int {
        get { return value }
        set { value = min(newValue, 100) } // このプロパティを100以下に制限
    }
}

struct MyStruct {
    @MyWrapper(initialValue: 42)
    var myValue: Int
}

var instance = MyStruct()
print(instance.myValue) // 出力: 42

instance.myValue = 120
print(instance.myValue) // 出力: 100

この例では、MyWrapper プロパティラッパーが定義されています。このラッパーは、プロパティの振る舞いを変更し、wrappedValue を通じてプロパティの値を制御します。@MyWrapper を使って MyStructmyValue プロパティにこのラッパーを適用しています。

プロパティラッパーを使用することで、再利用可能なコードを作成し、プロパティの振る舞いを簡単に拡張できます。次章で紹介しますが、SwiftUIやCombineフレームワークでよく見られる標準のプロパティラッパーもあります。

プロパティラッパー一覧

@State

ビュー内の状態を管理するために使用されます。この状態が変更されると、ビューが再描画されます。

@Binding

親ビューから渡されたプロパティを子ビューで更新するために使用されます。子ビューで @Binding が変更されると、それが元の親ビューのプロパティにも反映されます。

@Environment

SwiftUIの環境変数にアクセスするために使用されます。環境変数を使用すると、ビューが配置された階層内のどこからでも共通の値にアクセスできます。ビュー階層全体で共有される設定やデータのような値であり、アプリケーション全体で一貫した外観や動作を実現できます。

@ObservedObject

ObservableObject プロトコルに従うオブジェクトを監視し、そのオブジェクトが変更されたときにビューを再描画します。クラスの変更がビューに自動的に伝わり、UIが正確に更新されるようになります。UIの状態が外部のデータモデルと同期され、アプリケーションがより動的かつ柔軟になります。

@StateObject

ビューのライフサイクルを超えて状態を保持するために使用されます。通常、クラスが ObservableObject プロトコルを準拠し、ビュー内で単一のインスタンスが使用されます。ビュー内のデータを保持し、ビューが再描画されてもその状態が維持されるようにするために使用されます。

@FetchRequest

Core Dataからデータを取得するために使用されます。指定されたエンティティに対するフェッチリクエストを行い、その結果を SwiftUI ビューにバインドします。

以上になります。
これらのプロパティラッパーは、SwiftUIで状態管理やデータの取得と表示を行う際に重要な役割を果たしています。実際のアプリ開発について別記事であげていますのでご確認頂けますと幸いです。

アプリ”NowShare”をダウンロード
情報共有アプリ"NowShare"
今からみんなでナレッジ共有! 本当に欲しい情報をキャッチ&リリース 教えてあげたい情報を知りたい人にすぐに共有。 ためになった情報にはいいねを押して盛り上げよう!
エンジニア
ナスジニアをフォローする
🍆ナスジニアのブログ(iPhoneアプリ開発)

コメント

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