Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゼロから始めるPreferenceの実装 / Let's implement Preferen...

ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch

Avatar for Elvis Shi

Elvis Shi

July 19, 2025
Tweet

More Decks by Elvis Shi

Other Decks in Programming

Transcript

  1. var employedBy = "YUMEMI Inc." var job = "iOS Developer"

    var organizerOf = "HAKATA.swift" var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ ͜Ε͔Β@Environment(\.keyPath)એڭࢣͱ ໊৐͍͖͍ͬͯͨͱࢥ͍·͢! """ final class Me: Developable, Talkable { }
  2. ʮٯʯͱ͸ var body: some View { VStack { Text("Title") LazyVStack

    { ForEach(items) { item in Text(item.title) } } } } " " &OWJSPONFOU 1SFGFSFODF
  3. εςοϓ PreferenceKeyʹద߹ͨ͠structΛ࡞Δ struct IsProcessingKey: PreferenceKey { // ͜ͷPreferenceʹஔ͍ͯͷσϑΥϧτ஋ static var

    defaultValue: Bool = false static func reduce(value: inout Bool, nextValue: () -> Bool) { // ෳ਺ͷࢠڙ͔ΒPreferenceใࠂ͞Εͨ࣌ͷղܾ๏ } }
  4. εςοϓ ঢ়ଶΛใࠂ͍ͨ͠ࢠϏϡʔͰ.preferenceΛݺͿ struct ChildView: View { @State private var isProcessing:

    Bool = false var body: some View { SomeComponent() .preference(key: IsProcessingKey.self, value: isProcessing) } }
  5. εςοϓ ঢ়ଶΛड͚औΓ͍ͨ਌ϏϡʔͰ.onPreferenceChangeΛݺͿ struct ParentView: View { var body: some View

    { ChildView() .onPreferenceChange(IsProcessingKey.self) { isProcessing in // isProcessingͷ஋͕มΘͬͨ࣌ͷॲཧ } } }
  6. ؾΛ෇͚ΔϙΠϯτ w ঢ়ଶใࠂΛड͚Δ਌Ϗϡʔͷ.onPreferenceChangeͷݺͼग़͢͠Δ৔ॴʹ͸ ஫ҙΛ w ForEach΍GroupͷΑ͏ͳෳ਺ͷ3FTPMWFE7JFXΛ࡞Δ͔΋͠Εͳ͍ Viewʹ͚ͭΔͷ͸ආ͚Δ΂͠ w .reduceͷ࣮૷ΛͪΌΜͱߟ͑Δ΂͠ w

    Α͋͘Δ࣮૷ύλʔϯ w ϑϥάͷ৔߹͸࿦ཧ࿨ʗ࿦ཧੵ͕ཉ͍͠ͳͲ w ਺஋ͷ৔߹͸શ਺஋ͷ࿨΍ੵɺ΋͘͠͸࠷େ஋΍࠷খ஋ͳͲ w ܕʹΑΒͣ࠷ॳͷσʔλ͕ཉ͍͠ʗ࠷ޙͷσʔλ͕ཉ͍͠ͳͲ
  7. 5JQT w 7JFXΛ֦ுͯ͠ɺ1SFGFSFODF,FZͷܕΛ௚઀࢖Θͣʹ࢖͑ΔΑ͏ʹϝιου࡞ͬ ͓ͯ͘ͱศར w ঢ়ଶΛใࠂ͢Δϝιου • func property(_ value:

    Property) -> some View w ঢ়ଶΛड͚औΔϝιου • func onPropertyChange(_ action: @escaping (Property) -> Void) -> some View w ঢ়ଶΛड͚औͬͯͦͷ··ผͷঢ়ଶʹΞαΠϯ͢Δϝιου • func bindingProperty(to state: Binding<Property>) -> some View