เดธเตเดตเดฟเดซเตเดฑเตเดฑเตเดฏเตเดเดฏเดฟเดฒเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเด•เดธเดจเด‚. เดญเดพเด—เด‚ 1: เดกเดพเดฑเตเดฑเดพเดซเตเดฒเต‹เดฏเตเด‚ เดฑเต€เดกเด•เตเดธเตเด‚

เดธเตเดตเดฟเดซเตเดฑเตเดฑเตเดฏเตเดเดฏเดฟเดฒเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเด•เดธเดจเด‚. เดญเดพเด—เด‚ 1: เดกเดพเดฑเตเดฑเดพเดซเตเดฒเต‹เดฏเตเด‚ เดฑเต€เดกเด•เตเดธเตเด‚

WWDC 2019-เดฒเต† เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เด“เดซเต เดฏเต‚เดฃเดฟเดฏเตป เดธเต†เดทเดจเดฟเตฝ เดชเด™เตเด•เต†เดŸเตเดคเตเดคเดคเดฟเดจเต เดถเต‡เดทเด‚, SwiftUI-เดฏเดฟเดฒเต‡เด•เตเด•เต เด†เดดเตเดจเตเดจเดฟเดฑเด™เตเด™เดพเตป เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เดžเดพเตป เด…เดคเดฟเดจเตŠเดชเตเดชเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดงเดพเดฐเดพเดณเด‚ เดธเดฎเดฏเด‚ เดšเดฟเดฒเดตเดดเดฟเดšเตเดšเต, เด•เต‚เดŸเดพเดคเต† เดตเดฟเดถเดพเดฒเดฎเดพเดฏ เดถเตเดฐเต‡เดฃเดฟเดฏเดฟเดฒเตเดณเตเดณ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเดจเตเดจ เด’เดฐเต เดฏเดฅเดพเตผเดคเตเดฅ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดžเดพเตป เด‡เดคเดฟเดจเต† MovieSwiftUI เดŽเดจเตเดจเต เดตเดฟเดณเดฟเดšเตเดšเต - เด‡เดคเต เดชเตเดคเดฟเดฏเดคเตเด‚ เดชเดดเดฏเดคเตเดฎเดพเดฏ เดธเดฟเดจเดฟเดฎเด•เตพเด•เตเด•เดพเดฏเดฟ เดคเดฟเดฐเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดถเต‡เด–เดฐเดคเตเดคเดฟเตฝ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดพเดฃเต. TMDB API. เดžเดพเตป เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดธเดฟเดจเดฟเดฎเด•เดณเต† เดธเตเดจเต‡เดนเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดˆ เดฎเต‡เด–เดฒเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เดฎเตเดชเดจเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต, เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดฎเตเดฎเตเดชเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚. เด•เดฎเตเดชเดจเดฟเดฏเต† เด•เต‚เตพ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด†เดฏเดฟเดฐเตเดจเตเดจเต!

เดžเด™เตเด™เตพ เด“เตผเดฎเตเดฎเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต: "Habr"-เดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เตเด‚ - "Habr" เดชเตเดฐเตŠเดฎเต‹เดทเดฃเตฝ เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เด•เต‹เดดเตเดธเดฟเตฝ เดšเต‡เดฐเตเดฎเตเดชเต‹เตพ 10 เดฑเต‚เดฌเดฟเตพเดธเต เด•เดฟเดดเดฟเดตเต.

เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต: เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธ เด“เตบเดฒเตˆเตป เด•เต‹เดดเตเดธเต "เดชเตเดฐเตŠเดซเดทเตป เดœเดพเดต เดกเต†เดตเดฒเดชเตเดชเตผ".

เด…เดชเตเดชเต‹เตพ MovieSwiftUI-เดฏเตเด•เตเด•เต เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚?

  • API-เดฏเตเดฎเดพเดฏเดฟ เดธเด‚เดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต - เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดŽเดฒเตเดฒเดพ เด†เดงเตเดจเดฟเด• เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเดฟเดฒเต† เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดกเดพเดฑเตเดฑ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ JSON เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดธเตเดตเดฟเดซเตเดฑเตเดฑเต เดฎเต‹เดกเดฒเดฟเดฒเต‡เด•เตเด•เต เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เด•เต‹เดกเดฌเดฟเตพ.
  • เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดชเตเดฐเด•เดพเดฐเด‚ เดฒเต‹เดกเต เดšเต†เดฏเตเดค เดšเดฟเดคเตเดฐเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดต เด•เดพเดทเต† เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • iOS, iPadOS, macOS เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เดพเดฏเตเดณเตเดณ เดˆ เด†เดชเตเดชเต เดˆ OS-เด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพเด•เตเด•เต เดฎเดฟเด•เดšเตเดš UX เดจเตฝเด•เตเดจเตเดจเต.
  • เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เดกเดพเดฑเตเดฑ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เด…เดตเดฐเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดฎเต‚เดตเดฟ เดฒเดฟเดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดกเดพเดฑเตเดฑ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดจเดƒเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  • Redux เดชเดพเดฑเตเดฑเต‡เตบ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เดพเดดเตเดšเด•เดณเตเด‚ เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เดฎเต‹เดกเดฒเตเด•เดณเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ เดตเต‡เตผเดคเดฟเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดตเดฟเดŸเต†เดฏเตเดณเตเดณ เดกเดพเดฑเตเดฑเดพ เดชเตเดฐเดตเดพเดนเด‚ เดเด•เดฆเดฟเดถเดฏเดฟเดฒเดพเดฃเต. เด‡เดคเต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด•เดพเดทเต† เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดชเตเดจเดƒเดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเดจเตเด‚ เดคเดฟเดฐเตเดคเตเดคเดฟเดฏเต†เดดเตเดคเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.
  • เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป SwiftUI, TabbedView, SegmentedControl, NavigationView, Form, Modal เดฎเตเดคเดฒเดพเดฏเดตเดฏเตเดŸเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เด˜เดŸเด•เด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เด•เดพเดดเตเดšเด•เตพ, เด†เด‚เด—เตเดฏเด™เตเด™เตพ, UI/UX เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เดจเตฝเด•เตเดจเตเดจเต.

เดธเตเดตเดฟเดซเตเดฑเตเดฑเตเดฏเตเดเดฏเดฟเดฒเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเด•เดธเดจเด‚. เดญเดพเด—เด‚ 1: เดกเดพเดฑเตเดฑเดพเดซเตเดฒเต‹เดฏเตเด‚ เดฑเต€เดกเด•เตเดธเตเด‚
เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เด†เดจเดฟเดฎเต‡เดทเตป เดธเตเด—เดฎเดฎเดพเดฃเต, GIF เด…เตฝเดชเตเดชเด‚ เดžเต†เดŸเตเดŸเดฟเดชเตเดชเต‹เดฏเดฟ

เด†เดชเตเดชเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเดฟเด•เตเด•เต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เด…เดจเตเดญเดตเด‚ เดจเตฝเด•เดฟ, เดฎเตŠเดคเตเดคเดคเตเดคเดฟเตฝ เด‡เดคเต เด’เดฐเต เดจเดฒเตเดฒ เด…เดจเตเดญเดตเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดŽเดจเดฟเด•เตเด•เต เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเดฏ เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดŽเดดเตเดคเดพเตป เด•เดดเดฟเดžเตเดžเต, เดธเต†เดชเตเดฑเตเดฑเด‚เดฌเดฑเดฟเตฝ เดžเดพเตป เด…เดคเต เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•เดฏเตเด‚ iOS 13 เดจเตเดฑเต† เดฑเดฟเดฒเต€เดธเดฟเดจเตŠเดชเตเดชเด‚ เด†เดชเตเดชเตเดธเตเดฑเตเดฑเต‹เดฑเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

Redux, BindableObject, EnvironmentObject

เดธเตเดตเดฟเดซเตเดฑเตเดฑเตเดฏเตเดเดฏเดฟเดฒเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเด•เดธเดจเด‚. เดญเดพเด—เด‚ 1: เดกเดพเดฑเตเดฑเดพเดซเตเดฒเต‹เดฏเตเด‚ เดฑเต€เดกเด•เตเดธเตเด‚

เดžเดพเตป เด‡เดชเตเดชเต‹เตพ เดเด•เดฆเต‡เดถเด‚ เดฐเดฃเตเดŸเต เดตเตผเดทเดฎเดพเดฏเดฟ Redux-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เดŽเดจเดฟเด•เตเด•เต เด…เดคเดฟเตฝ เดจเดฒเตเดฒ เดชเดฐเดฟเดšเดฏเดฎเตเดฃเตเดŸเต. เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเตเด‚, เดžเดพเตป เด‡เดคเต เดฎเตเตปเดตเดถเดคเตเดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เดคเดฟเดฐเดฟเดšเตเดšเดŸเดฟ เดจเดŸเดคเตเดคเตเด• เดตเต†เดฌเตโ€Œเดธเตˆเดฑเตเดฑเต, เด•เต‚เดŸเดพเดคเต† เดจเต‡เดฑเตเดฑเต€เดตเต iOS (เดธเตเดตเดฟเดซเตเดฑเตเดฑเต), เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต (เด•เต‹เดŸเตเดŸเตเดฒเดฟเตป) เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚.

เด’เดฐเต SwiftUI เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑเดพ เดซเตเดฒเต‹ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดพเดฏเดฟ Redux เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเดคเดฟเตฝ เดžเดพเตป เด’เดฐเดฟเด•เตเด•เดฒเตเด‚ เด–เต‡เดฆเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. UIKit เด†เดชเตเดชเดฟเตฝ Redux เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดเดฑเตเดฑเดตเตเด‚ เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟ เดจเดฟเดฑเดžเตเดž เดญเดพเด—เด™เตเด™เตพ เดธเตเดฑเตเดฑเต‹เดฑเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดกเดพเดฑเตเดฑ เดจเต‡เดŸเตเด•เดฏเตเด‚ เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเด•เดฏเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เดพเดดเตเดšเด•เตพ/เด˜เดŸเด•เด™เตเด™เตพ เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดชเตเดชเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดŽเดจเดฟเด•เตเด•เต เด•เดฃเด•เตเดŸเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดคเดฐเด‚ เดฒเตˆเดฌเตเดฐเดฑเดฟ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดฟ เดตเดจเตเดจเต (ReSwift, ReKotlin เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต). เดจเดจเตเดจเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เดงเดพเดฐเดพเดณเด‚ เด•เต‹เดกเต. เดจเดฟเตผเดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด‡เดคเต (เด‡เดคเตเดตเดฐเต†) เด“เดชเตเดชเตบ เดธเต‹เดดเตเดธเต เด…เดฒเตเดฒ.

เดจเดฒเตเดฒ เดตเดพเดฐเตเดคเตเดค! SwiftUI-เตฝ เดตเดฟเดทเดฎเดฟเด•เตเด•เต‡เดฃเตเดŸ เด’เดฐเต‡เดฏเตŠเดฐเต เด•เดพเดฐเตเดฏเด‚ - เดจเดฟเด™เตเด™เตพ Redux เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ - เดธเตเดฑเตเดฑเต‹เดฑเตเด•เตพ, เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเตเด•เตพ, เดฑเดฟเดกเตเดฏเต‚เดธเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดตเดฏเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดพเดฃเต. @EnvironmentObject-เดจเต เดจเดจเตเดฆเดฟ, เดธเตเดฑเตเดฑเต‹เดฑเตเดฎเดพเดฏเตเดณเตเดณ เด‡เดŸเดชเต†เดŸเตฝ SwiftUI เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เดธเตเดฑเตเดฑเต‹เตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเต เด’เดฐเต BindableObject เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต.

เดžเดพเตป เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเดตเดฟเดซเตเดฑเตเดฑเต เดชเดพเด•เตเด•เต‡เดœเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต, SwiftUIFlux, เด‡เดคเต Redux-เดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เด‰เดชเดฏเต‹เด—เด‚ เดจเตฝเด•เตเดจเตเดจเต. เดŽเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เด‡เดคเต MovieSwiftUI-เดฏเตเดŸเต† เดญเดพเด—เดฎเดพเดฃเต. เดžเดพเดจเตเด‚ เด’เดฐเต เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเตเดณเตเดณ เดŸเตเดฏเต‚เดŸเตเดŸเต‹เดฑเดฟเดฏเตฝ เดŽเดดเตเดคเดฟ, เดˆ เด˜เดŸเด•เด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚.

เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต?

final public class Store<State: FluxState>: BindableObject {
    public let willChange = PassthroughSubject<Void, Never>()
        
    private(set) public var state: State
    
    private func _dispatch(action: Action) {
        willChange.send()
        state = reducer(state, action)
    }
}

เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เดดเต†เดฒเตเดฒเดพเด‚, เดจเดฟเด™เตเด™เตพ เด—เดฟเดฏเตผเดฌเต‹เด•เตเดธเต เดธเดœเต€เดตเดฎเดพเด•เตเด•เตเดจเตเดจเต. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เด…เดตเดธเตเดฅ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเด‚. เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจ เดคเดฐเดคเตเดคเดฟเดจเตเด‚ เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เตเด‚ เด…เดจเตเดธเตƒเดคเดฎเดพเดฏเดฟ เด’เดฐเต เดชเตเดคเดฟเดฏ เดชเดฐเดฟเดทเตเด•เดฐเดฟเดšเตเดš เด…เดตเดธเตเดฅ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด‚.

เดถเดฐเดฟ, เดธเตเดฑเตเดฑเต‹เตผ เด’เดฐเต BindableObject เด†เดฏเดคเดฟเดจเดพเตฝ, PassthroughSubject เดจเตฝเด•เตเดจเตเดจ willChange เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเตเดฏเด‚ เดฎเดพเดฑเตเดฎเตเดชเต‹เตพ เด…เดคเต SwiftUI-เดฏเต† เด…เดฑเดฟเดฏเดฟเด•เตเด•เตเด‚. เด•เดพเดฐเดฃเด‚, BindableObject เด’เดฐเต PublisherType เดจเตฝเด•เดฃเด‚, เดŽเดจเตเดจเดพเตฝ เด…เดคเต เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเด‚ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฒเดพเดฃเต. เดฎเตŠเดคเตเดคเดคเตเดคเดฟเตฝ, เด‡เดคเต เด†เดชเตเดชเดฟเดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดตเดณเดฐเต† เดถเด•เตเดคเดฎเดพเดฏ เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต. เด…เดคเดจเตเดธเดฐเดฟเดšเตเดšเต, เด…เดŸเตเดคเตเดค เดฑเต†เตปเดกเดฑเดฟเด‚เด—เต เดธเตˆเด•เตเด•เดฟเดณเดฟเตฝ, เดธเด‚เดธเตเดฅเดพเดจ เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเดจเตเดธเดฐเดฟเดšเตเดšเต เด•เดพเดดเตเดšเด•เดณเตเดŸเต† เดฌเต‹เดกเดฟ เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเดพเตป SwiftUI เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚.

เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เด‡เดคเต เดธเตเดตเดฟเดซเตเดฑเตเดฑเตเดฏเตเดเดฏเตเดŸเต† เดŽเดฒเตเดฒเดพ เดนเตƒเดฆเดฏเดตเตเด‚ เดฎเดพเดจเตเดคเตเดฐเดฟเด•เดตเตเดฎเดพเดฃเต. เด‡เดชเตเดชเต‹เตพ, เด’เดฐเต เดธเด‚เดธเตเดฅเดพเดจเด‚ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตเดšเต†เดฏเตเดฏเตเดจเตเดจ เดเดคเต เดตเต€เด•เตเดทเดฃเดคเตเดคเดฟเดฒเตเด‚, เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต เดจเดฟเดจเตเดจเต เดŽเดจเตเดคเต เดกเดพเดฑเตเดฑเดฏเดพเดฃเต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเต, เดŽเดจเตเดคเดพเดฃเต เดฎเดพเดฑเดฟเดฏเดคเต เดŽเดจเตเดจเดคเดฟเดจเต เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เด•เดพเดดเตเดš เดฑเต†เตปเดกเตผ เดšเต†เดฏเตเดฏเตเด‚.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
 
    var window: UIWindow?
 
 
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            
            let controller = UIHostingController(rootView: HomeView().environmentObject(store))
            window.rootViewController = controller
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}
 
struct CustomListCoverRow : View {
    @EnvironmentObject var store: Store<AppState>
    
    let movieId: Int
    var movie: Movie! {
        return store.state.moviesState.movies[movieId]
    }
    
    var body: some View {
        HStack(alignment: .center, spacing: 0) {
            Image(movie.poster)
        }.listRowInsets(EdgeInsets())
    }
}

เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดธเตเดฑเตเดฑเต‹เตผ เด’เดฐเต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเดพเดฏเดฟ เด•เตเดคเตเดคเดฟเดตเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ @EnvironmentObject เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดเดคเต เด•เดพเดดเตโ€Œเดšเดฏเดฟเดฒเตเด‚ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚. เดชเต†เตผเดซเต‹เดฎเตปเดธเต เดชเต†เดจเดพเตฝเดฑเตเดฑเดฟ เด‡เดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดกเต†เดฑเตˆเดตเต เดšเต†เดฏเตเดค เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟเด•เตพ เดตเต‡เด—เดคเตเดคเดฟเตฝ เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเด•เดฏเต‹ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด…เดตเดธเตเดฅเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เดฃเด•เตเด•เดพเด•เตเด•เตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดธเดฟเดจเดฟเดฎเดฏเตเดŸเต† เดชเต‹เดธเตเดฑเตเดฑเตผ เดฎเดพเดฑเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เดฎเตเด•เดณเดฟเดฒเต† เด•เต‹เดกเต เดšเดฟเดคเตเดฐเด‚ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต.

เด‡เดคเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด’เดฐเต เดตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต, เด…เดคเดฟเดจเตเดฑเต† เดธเดนเดพเดฏเดคเตเดคเต‹เดŸเต† เด•เดพเดดเตเดšเด•เตพ เดธเด‚เดธเตเดฅเดพเดจเดตเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดจเดฟเด™เตเด™เตพ iOS-เตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเต‹เดฒเตเด‚ ReSwift-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เด•เดฃเด•เตเดŸเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต SwiftUI-เดฏเตเดŸเต† เดฎเดพเดจเตเดคเตเดฐเดฟเด•เดค เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด‚.

เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดธเดœเต€เดตเดฎเดพเด•เตเด•เดฟ เดชเตเดคเดฟเดฏ เดธเด‚เดธเตเดฅเดพเดจเด‚ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚. เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดคเดพ.

struct CustomListDetail : View {
    @EnvironmentObject var store: Store<AppState>
 
    let listId: Int
    
    var list: CustomList {
        store.state.moviesState.customLists[listId]!
    }
    
    var movies: [Int] {
        list.movies.sortedMoviesIds(by: .byReleaseDate, state: store.state)
    }
    
    var body: some View {
        List {
            ForEach(movies) { movie in
                NavigationLink(destination: MovieDetail(movieId: movie).environmentObject(self.store)) {
                    MovieRow(movieId: movie, displayListImage: false)
                }
            }.onDelete { (index) in
               self.store.dispatch(action: MoviesActions.RemoveMovieFromCustomList(list: self.listId, movie: self.movies[index.first!]))
            }
        }
    }
}

เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด•เต‹เดกเดฟเตฝ, เด“เดฐเต‹ IP-เดจเตเด‚ SwiftUI-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ .onDelete เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดžเดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดฒเดฟเดธเตเดฑเตเดฑเดฟเดฒเต† เดตเดฐเดฟเดฏเต† เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เดพเตป เดธเดพเดงเดพเดฐเดฃ iOS เดธเตเดตเตˆเดชเตเดชเต เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดกเดฟเดฒเต€เดฑเตเดฑเต เดฌเดŸเตเดŸเดฃเดฟเตฝ เดธเตเดชเตผเดถเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด…เดคเต เด…เดจเตเดฌเดจเตเดง เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเต† เดŸเตเดฐเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดฒเดฟเดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเดฟเดจเดฟเดฎ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดถเดฐเดฟ, เดฒเดฟเดธเตเดฑเตเดฑเต เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟ BindableObject เด…เดตเดธเตเดฅเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด‰เดฐเตเดคเตเดคเดฟเดฐเดฟเดžเตเดžเดคเตเด‚ เด’เดฐเต EnvironmentObject เด†เดฏเดฟ เด•เตเดคเตเดคเดฟเดตเดฏเตเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดคเตเด‚ เด†เดฏเดคเดฟเดจเดพเตฝ, SwiftUI เดฒเดฟเดธเตเดฑเตเดฑเต เด…เดชเตเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด•เดพเดฐเดฃเด‚ ForEach เดธเดฟเดจเดฟเดฎเด•เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เดฟเดฏ เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟเดฏเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

MoviesState reducer-เดจเตเดฑเต† เดญเดพเด—เด‚ เด‡เดคเดพ:

func moviesStateReducer(state: MoviesState, action: Action) -> MoviesState {
    var state = state
    switch action {
    
    // other actions.
    
    case let action as MoviesActions.AddMovieToCustomList:
        state.customLists[action.list]?.movies.append(action.movie)
        
    case let action as MoviesActions.RemoveMovieFromCustomList:
        state.customLists[action.list]?.movies.removeAll{ $0 == action.movie }
        
    default:
        break
    }
    return state
}

เดฎเตเด•เดณเดฟเตฝ เดชเดฑเดžเตเดžเดคเตเดชเต‹เดฒเต†, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด…เดฏเดšเตเดšเต เด’เดฐเต เดชเตเดคเดฟเดฏ เด…เดตเดธเตเดฅ เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเดฎเตเดชเต‹เตพ เดฑเดฟเดกเตเดฏเต‚เดธเตผ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚.

เดžเดพเตป เด‡เดคเตเดตเดฐเต† เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเดฟเดฒเตเดฒ - เดŽเดจเตเดคเดพเดฃเต เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต†เดจเตเดจเต เดธเตเดตเดฟเดซเตเดฑเตเดฑเตเดฏเตเดเด•เตเด•เต เดŽเด™เตเด™เดจเต† เด…เดฑเดฟเดฏเดพเด‚. เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เด†เดดเดคเตเดคเดฟเตฝ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเตป, เด…เดคเต เดตเดฟเดฒเดฎเดคเดฟเด•เตเด•เตเดจเตเดจเต เดกเดพเดฑเตเดฑเดพ เดซเตเดฒเต‹เดฏเดฟเตฝ WWDC เดธเต†เดทเตป เด•เดพเดฃเตเด• SwiftUI-เตฝ. เดŽเดจเตเดคเดฟเดจเต, เดŽเดชเตเดชเต‹เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเตเด‚ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต เด…เดตเดธเตเดฅ, @Binding, ObjectBinding, EnvironmentObject.

เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•