// 📦 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()
}
}
// 📦 AllValues<T>
public struct AllValues<T>: PreferenceKey {
// ⭐️ 收集的資料放在 [T] 裡面
public typealias Value = [T]
// ⭐️ 初始值:空陣列
public static var defaultValue: Value { Value() }
// ⭐️ 加入新資料的方法:[v1, v2, ...] + [vn]
public static func reduce(value: inout Value, nextValue: () -> Value) {
value += nextValue() // nextValue() == [vn]
}
}
// 📦 FirstNonNil<T>
public struct FirstNonNil<T>: PreferenceKey {
public typealias Value = T?
// default value
public static var defaultValue: Value { nil }
// combine values from different child views
public static func reduce(value: inout Value, nextValue: () -> Value) {
value = value ?? nextValue() // nil or first non-nil value
}
}
📦 PreferenceKeys
Preferences
用法
設 K 為遵循 PreferenceKey 的真實型別 (concrete type),則使用這個 PreferenceKey 時,通常必須具備以下「三大要素」: