🅿️PreferenceKey

The PreferenceKey protocol enables a way to send data up the view hierarchy. 👉 SwiftOnTap

當一開始佈局時 (layout),就要子視件回報一些資料給母視件才能順利完成佈局的話,就可以考慮使用 PreferenceKey

範例

// 📦 MaxValue<T: FloatingPoint>
public struct MaxValue<T: FloatingPoint>: PreferenceKey {
    // value type
    public typealias Value = T?
    // default value (nil == not set) 
    public static var defaultValue: Value { nil }
    // ⭐️ choose max value
    public static func reduce(value: inout Value, nextValue: () -> Value) {
        // ⭐️ [T?] --(compactMap)--> [T] --(max)--> T?
        value = [value, nextValue()].compactMap{ $0 }.max()
    }
}

用法

K 為遵循 PreferenceKey 的真實型別 (concrete type),則使用這個 PreferenceKey 時,通常必須具備以下「三大要素」:

  • K 本身:負責定義如何「處理子視件回報的值

  • 母視件@State 變數:通常型別與 K.Value 相同,負責「更新子視件的佈局」。

  • 子視件@Binding 變數:負責「承接來自母視件的更新通知」。

有了這些要素後,還要依照固定的模式,才能順利完成佈局,主要是以下的「三步驟」:

整個流程可以簡化為:

  • 子視件回報 ➜ PreferenceKey 處理 ➜ 母視件更新

👉 比較:Anchor Preferences

⭐️ 取名原則

PreferenceKey 的名字最好是跟母視件的 @State 變數一致,例如: 如果我們要找的是某個子視件兩邊長中的最大邊,這時可以:

  • 母視件的 @State 變數取名為: maxSide

  • PreferenceKey 就取名為: MaxSide

👉 參見:💈 CircleText

👉 自製型別:📦 PreferenceKeys

Last updated

Was this helpful?