๐Ÿ…ฟ๏ธ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 ่ฎŠๆ•ธ๏ผš่ฒ ่ฒฌใ€Œๆ‰ฟๆŽฅไพ†่‡ชๆฏ่ฆ–ไปถ็š„ๆ›ดๆ–ฐ้€š็Ÿฅใ€ใ€‚

ๆœ‰ไบ†้€™ไบ›่ฆ็ด ๅพŒ๏ผŒ้‚„่ฆไพ็…งๅ›บๅฎš็š„ๆจกๅผ๏ผŒๆ‰่ƒฝ้ †ๅˆฉๅฎŒๆˆไฝˆๅฑ€๏ผŒไธป่ฆๆ˜ฏไปฅไธ‹็š„ใ€Œไธ‰ๆญฅ้ฉŸใ€๏ผš

  • ็”ฑๅญ่ฆ–ไปถๅ›žๅ ฑๅ€ผ็ตฆ K๏ผš็”จ child.preference(key:value:) ๅ›žๅ ฑ

  • ็”ฑ K ่ฒ ่ฒฌ่™•็†ๅ›žๅ ฑ็š„ๅ€ผ๏ผš็”จ K.reduce(value:nextValue) ่™•็†

  • ็”ฑๆฏ่ฆ–ไปถๆ นๆ“šๅ›žๅ ฑ็š„ๅ€ผ๏ผŒๆ›ดๆ–ฐ่‡ชๅทฑ็š„ @State๏ผš็”จ parent.onPreferenceChange(_:perform:) ่™•็†

ๆ•ดๅ€‹ๆต็จ‹ๅฏไปฅ็ฐกๅŒ–็‚บ๏ผš

  • ๅญ่ฆ–ไปถๅ›žๅ ฑ โžœ PreferenceKey ่™•็† โžœ ๆฏ่ฆ–ไปถๆ›ดๆ–ฐ

๐Ÿ‘‰ ๆฏ”่ผƒ๏ผšAnchor Preferences

โญ๏ธ ๅ–ๅๅŽŸๅ‰‡

PreferenceKey ็š„ๅๅญ—ๆœ€ๅฅฝๆ˜ฏ่ทŸๆฏ่ฆ–ไปถ็š„ @State ่ฎŠๆ•ธไธ€่‡ด๏ผŒไพ‹ๅฆ‚๏ผš ๅฆ‚ๆžœๆˆ‘ๅ€‘่ฆๆ‰พ็š„ๆ˜ฏๆŸๅ€‹ๅญ่ฆ–ไปถๅ…ฉ้‚Š้•ทไธญ็š„ๆœ€ๅคง้‚Š๏ผŒ้€™ๆ™‚ๅฏไปฅ๏ผš

  • ๅฐ‡ๆฏ่ฆ–ไปถ็š„ @State ่ฎŠๆ•ธๅ–ๅ็‚บ๏ผš maxSide

  • ่€Œ PreferenceKey ๅฐฑๅ–ๅ็‚บ: MaxSide

๐Ÿ‘‰ ๅƒ่ฆ‹๏ผš๐Ÿ’ˆ CircleText

๐Ÿ‘‰ ่‡ช่ฃฝๅž‹ๅˆฅ๏ผš๐Ÿ“ฆ PreferenceKeys

Last updated