SwiftUI 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเจ•เจพเจธเฅค เจญเจพเจ— 1: เจกเจพเจŸเจพเจซเจฒเฉ‹ เจ…เจคเฉ‡ Redux

SwiftUI 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเจ•เจพเจธเฅค เจญเจพเจ— 1: เจกเจพเจŸเจพเจซเจฒเฉ‹ เจ…เจคเฉ‡ Redux

เจกเจฌเจฒเจฏเฉ‚เจกเจฌเจฒเจฏเฉ‚เจกเฉ€เจธเฉ€ 2019 เจฆเฉ‡ เจธเจŸเฉ‡เจŸ เจ†เจซ เจฆ เจฏเฉ‚เจจเฉ€เจ…เจจ เจธเฉˆเจธเจผเจจ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฎเฉˆเจ‚ SwiftUI เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ€ เจกเฉเจฌเจ•เฉ€ เจฒเฉˆเจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพเฅค เจฎเฉˆเจ‚ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจธเจฎเจพเจ‚ เจฌเจฟเจคเจพเจ‡เจ† เจนเฉˆ เจ…เจคเฉ‡ เจนเฉเจฃ เจ‡เฉฑเจ• เจ…เจธเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจœเฉ‹ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจตเจฟเจธเจผเจพเจฒ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจฒเจˆ เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ.

เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฎเฉ‚เจตเฉ€เจธเจตเจฟเจซเจŸเจฏเฉ‚เจ†เจˆ เจ•เจฟเจนเจพ - เจ‡เจน เจจเจตเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจฃเฉ€เจ†เจ‚ เจซเจฟเจฒเจฎเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเจจ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเฉฐเจ—เฉเจฐเจนเจฟ เจตเจฟเฉฑเจš เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจเจช เจนเฉˆ TMDB API. เจฎเฉˆเจ‚ เจนเจฎเฉ‡เจธเจผเจพ เจซเจฟเจฒเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจชเจธเฉฐเจฆ เจ•เฉ€เจคเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจ•เฉฐเจชเจจเฉ€ เจตเฉ€ เจฌเจฃเจพเจˆ เจนเฉˆ, เจนเจพเจฒเจพเจ‚เจ•เจฟ เจฌเจนเฉเจค เจธเจฎเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚เฅค เจ•เฉฐเจชเจจเฉ€ เจจเฉ‚เฉฐ เจธเจผเจพเจ‡เจฆ เจนเฉ€ เจ เฉฐเจกเจพ เจ•เจฟเจนเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเฉ€!

เจ…เจธเฉ€เจ‚ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚: "Habr" เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ - "Habr" เจชเฉเจฐเจšเจพเจฐ เจ•เฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจ•เฉ‹เจฐเจธ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒเจพ เจฒเฉˆเจฃ เจตเฉ‡เจฒเฉ‡ 10 เจฐเฉ‚เจฌเจฒ เจฆเฉ€ เจ›เฉ‹เจŸเฅค

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ: เจตเจฟเจฆเจฟเจ…เจ• เจ”เจจเจฒเจพเจˆเจจ เจ•เฉ‹เจฐเจธ "เจชเฉเจฐเฉ‹เจซเฉˆเจธเจผเจจ เจœเจพเจตเจพ เจกเจฟเจตเฉˆเจฒเจชเจฐ".

เจคเจพเจ‚ MovieSwiftUI เจ•เฉ€ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ?

  • API เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ - เจฒเจ—เจญเจ— เจ•เฉ‹เจˆ เจตเฉ€ เจ†เจงเฉเจจเจฟเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ…เจœเจฟเจนเจพ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค
  • เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ 'เจคเฉ‡ เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจกเฉ‡เจŸเจพ เจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ JSON เจจเฉ‚เฉฐ เจธเจตเจฟเจซเจŸ เจฎเจพเจกเจฒ เจตเจฟเฉฑเจš เจชเจพเจฐเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เฉ‹เจกเฉ‡เจฌเจฒ.
  • เจฌเฉ‡เจจเจคเฉ€ 'เจคเฉ‡ เจฒเฉ‹เจก เจ•เฉ€เจคเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉˆเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • iOS, iPadOS, เจ…เจคเฉ‡ macOS เจฒเจˆ เจ‡เจน เจเจช เจ‡เจนเจจเจพเจ‚ OS เจฆเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† UX เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจกเฉ‡เจŸเจพ เจคเจฟเจ†เจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ€ เจ–เฉเจฆ เจฆเฉ€ เจซเจฟเจฒเจฎ เจธเฉ‚เจšเฉ€ เจฌเจฃเจพ เจธเจ•เจฆเจพ เจนเฉˆ. เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ…เจคเฉ‡ เจฐเฉ€เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค
  • เจตเจฟเจฏเฉ‚เจœเจผ, เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจ…เจคเฉ‡ เจฎเจพเจกเจฒเจพเจ‚ เจจเฉ‚เฉฐ Redux เจชเฉˆเจŸเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเฉฑเจ– เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ‡เฉฑเจฅเฉ‡ เจกเฉ‡เจŸเจพ เจฆเจพ เจชเฉเจฐเจตเจพเจน เจ‡เฉฑเจ• เจฆเจฟเจธเจผเจพเจนเฉ€เจฃ เจนเฉˆเฅค เจ‡เจธ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉˆเจธเจผ, เจฐเฉ€เจธเจŸเฉ‹เจฐ เจ…เจคเฉ‡ เจ“เจตเจฐเจฐเจพเจˆเจŸ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค
  • เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ SwiftUI, TabbedView, SegmentedControl, NavigationView, Form, Modal, เจ†เจฆเจฟ เจฆเฉ‡ เจฎเฉ‚เจฒ เจญเจพเจ—เจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจ•เจธเจŸเจฎ เจฆเฉเจฐเจฟเจธเจผ, เจธเฉฐเจ•เฉ‡เจค, UI/UX เจตเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

SwiftUI 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเจ•เจพเจธเฅค เจญเจพเจ— 1: เจกเจพเจŸเจพเจซเจฒเฉ‹ เจ…เจคเฉ‡ Redux
เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจเจจเฉ€เจฎเฉ‡เจธเจผเจจ เจจเจฟเจฐเจตเจฟเจ˜เจจ เจนเฉˆ, GIF เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจเจŸเจ•เจพ เจนเฉ‹เจ‡เจ† เจนเฉˆ

เจเจช 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจจเจพเจฒ เจฎเฉˆเจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจ…เจจเฉเจญเจต เจฎเจฟเจฒเจฟเจ† เจ…เจคเฉ‡ เจ•เฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจ•เฉ‡ เจ‡เจน เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจ…เจจเฉเจญเจต เจธเฉ€เฅค เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจธเฉ€, เจธเจคเฉฐเจฌเจฐ เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเฉเจงเจพเจฐเจพเจ‚เจ—เจพ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจเจชเจธเจŸเฉ‹เจฐ เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจพเจ‚เจ—เจพ, เจจเจพเจฒ เจนเฉ€ iOS 13 เจฆเฉ€ เจฐเจฟเจฒเฉ€เจœเจผ เจฆเฉ‡ เจจเจพเจฒเฅค

Redux, BindableObject เจ…เจคเฉ‡ EnvironmentObject

SwiftUI 'เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเจ•เจพเจธเฅค เจญเจพเจ— 1: เจกเจพเจŸเจพเจซเจฒเฉ‹ เจ…เจคเฉ‡ Redux

เจฎเฉˆเจ‚ เจนเฉเจฃ เจฒเจ—เจญเจ— เจฆเฉ‹ เจธเจพเจฒเจพเจ‚ เจคเฉ‹เจ‚ Redux เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจนเจพเจ‚, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจฎเฉเจ•เจพเจฌเจฒเจคเจจ เจšเฉฐเจ—เฉ€ เจคเจฐเฉเจนเจพเจ‚ เจœเจพเจฃเฉ‚ เจนเจพเจ‚เฅค เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡, เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจซเจฐเฉฐเจŸเจเจ‚เจก เจตเจฟเฉฑเจš เจฒเจˆ เจตเจฐเจคเจฆเจพ เจนเจพเจ‚ เจชเฉเจฐเจคเฉ€เจ•เจฟเจฐเจฟเจ† เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจจเฉ‡เจŸเจฟเจต เจ†เจˆเจ“เจเจธ (เจธเจตเจฟเจซเจŸ) เจ…เจคเฉ‡ เจเจ‚เจกเจฐเจพเจ‡เจก (เจ•เฉ‹เจŸเจฒเจฟเจจ) เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจฒเจˆเฅค

เจฎเฉˆเจจเฉ‚เฉฐ 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 เจนเฉˆ, เจ‡เจน SwiftUI เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเฉ‡เจ—เจพ เจœเจฆเฉ‹เจ‚ PassthroughSubject เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเฉ€ willChange เจชเฉเจฐเจพเจชเจฐเจŸเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เจธเจฆเจพ เจฎเฉเฉฑเจฒ เจฌเจฆเจฒเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ‡เจธ เจฒเจˆ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ BindableObject เจจเฉ‚เฉฐ เจ‡เฉฑเจ• PublisherType เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจชเจฐ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจ‡เจธเจฆเฉ‡ เจชเฉเจฐเจฌเฉฐเจงเจจ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค เจ•เฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจ•เฉ‡, เจ‡เจน เจเจชเจฒ เจฆเจพ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจธเฉฐเจฆ เจนเฉˆเฅค เจ‡เจธ เจ…เจจเฉเจธเจพเจฐ, เจ…เจ—เจฒเฉ‡ เจฐเฉˆเจ‚เจกเจฐเจฟเฉฐเจ— เจšเฉฑเจ•เจฐ เจตเจฟเฉฑเจš, SwiftUI เจฐเจพเจœ เจฆเฉ‡ เจฌเจฆเจฒเจพเจ… เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจตเจฟเจšเจพเจฐเจพเจ‚ เจฆเฉ‡ เจธเจฐเฉ€เจฐ เจจเฉ‚เฉฐ เจฐเฉˆเจ‚เจกเจฐ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพเฅค

เจฆเจฐเจ…เจธเจฒ, เจ‡เจน 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 เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เฉฐเจœเฉˆเจ•เจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจซเจฟเจฐ @EnvironmentObject เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฆเฉเจฐเจฟเจธเจผ เจตเจฟเฉฑเจš เจชเจนเฉเฉฐเจšเจฏเฉ‹เจ— เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ•เฉ‹เจˆ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจœเฉเจฐเจฎเจพเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจœเจฒเจฆเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเจพเจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจธเจฅเจฟเจคเฉ€ เจคเฉ‹เจ‚ เจ—เจฃเจจเจพ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจ‰เจชเจฐเฉ‹เจ•เจค เจ•เฉ‹เจก เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฆเจพ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจซเจฟเจฒเจฎ เจฆเจพ เจชเฉ‹เจธเจŸเจฐ เจฌเจฆเจฒเจฆเจพ เจนเฉˆเฅค

เจ…เจคเฉ‡ เจ‡เจน เจ…เจธเจฒ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจฒเจพเจˆเจจ เจจเจพเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจœเจฟเจธ เจฆเฉ€ เจฎเจฆเจฆ เจจเจพเจฒ เจตเจฟเจšเจพเจฐ เจฐเจพเจœ เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจนเฉ‹เจ เจนเจจ. เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ iOS 'เจคเฉ‡ ReSwift เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ เจนเฉˆ เจœเจพเจ‚ เจซเจฟเจฐ เจตเฉ€ เจจเจพเจฒ เจœเฉเฉœเจจ React เจจเจพเจฒ, เจคเฉเจธเฉ€เจ‚ 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 เจซเจฟเจฒเจฎเจพเจ‚ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‡เจฆเจพเจฆ เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค

เจ‡เฉฑเจฅเฉ‡ เจฎเฉ‚เจตเฉ€เจœเจผเจธเจŸเฉ‡เจŸ เจฐเฉ€เจกเจฟเจŠเจธเจฐ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจนเฉˆ:

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
}

เจฐเฉ€เจกเจฟเจŠเจธเจฐ เจ‰เจฆเฉ‹เจ‚ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจ•เจพเจฐเจตเจพเจˆ เจญเฉ‡เจœเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจธเจฅเจฟเจคเฉ€ เจตเจพเจชเจธ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค

เจฎเฉˆเจ‚ เจ…เจœเฉ‡ เจตเฉ‡เจฐเจตเฉ‡ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจœเจพเจตเจพเจ‚เจ—เจพ - เจ•เจฟเจตเฉ‡เจ‚ SwiftUI เจ…เจธเจฒ เจตเจฟเฉฑเจš เจœเจพเจฃเจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจนเฉˆ. เจ‡เจธ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจกเฉ‚เฉฐเจ˜เจพเจˆ เจจเจพเจฒ เจธเจฎเจเจฃ เจฒเจˆ, เจ‡เจน เจ•เฉ€เจฎเจคเฉ€ เจนเฉˆ เจกเจพเจŸเจพ เจชเฉเจฐเจตเจพเจน 'เจคเฉ‡ WWDC เจธเฉˆเจธเจผเจจ เจฆเฉ‡เจ–เฉ‹ SwiftUI เจตเจฟเฉฑเจš. เจ‡เจน เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจ‡เจน เจตเฉ€ เจฆเฉฑเจธเจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เจฟเจ‰เจ‚ เจ…เจคเฉ‡ เจ•เจฆเฉ‹เจ‚ เจตเจฐเจคเจฃเจพ เจนเฉˆ เจฐเจพเจœ, @Binding, ObjectBinding เจ…เจคเฉ‡ EnvironmentObject.

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹