แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ SwiftUI-แƒ–แƒ”. แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 1: Dataflow แƒ“แƒ Redux

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ SwiftUI-แƒ–แƒ”. แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 1: Dataflow แƒ“แƒ Redux

WWDC 2019-แƒ–แƒ” แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒกแƒ”แƒกแƒ˜แƒแƒ–แƒ” แƒ“แƒแƒกแƒฌแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒฆแƒ แƒ›แƒแƒ“ แƒฉแƒแƒ›แƒ”แƒ•แƒšแƒ SwiftUI. แƒ›แƒ” แƒ“แƒ˜แƒ“แƒ˜ แƒ“แƒ แƒ แƒ’แƒแƒ•แƒแƒขแƒแƒ แƒ” แƒ›แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒจแƒ˜ แƒ“แƒ แƒแƒฎแƒšแƒ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ” แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒงแƒแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ—แƒ แƒคแƒแƒ แƒ—แƒ แƒกแƒžแƒ”แƒฅแƒขแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒ” แƒ›แƒแƒก แƒ•แƒฃแƒฌแƒแƒ“แƒ” MovieSwiftUI - แƒ”แƒก แƒแƒ แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒแƒฎแƒแƒšแƒ˜ แƒ“แƒ แƒซแƒ•แƒ”แƒšแƒ˜ แƒคแƒ˜แƒšแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒแƒซแƒ”แƒ‘แƒœแƒแƒ“, แƒแƒกแƒ”แƒ•แƒ” แƒ™แƒแƒšแƒ”แƒฅแƒชแƒ˜แƒแƒจแƒ˜ แƒ›แƒแƒ—แƒ˜ แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. TMDB API. แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒงแƒ•แƒแƒ แƒ“แƒ แƒคแƒ˜แƒšแƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒแƒ› แƒกแƒคแƒ”แƒ แƒแƒจแƒ˜ แƒ›แƒแƒ›แƒฃแƒจแƒแƒ•แƒ” แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒแƒช แƒ™แƒ˜ แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜, แƒ—แƒฃแƒ›แƒชแƒ แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ. แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒแƒก แƒซแƒœแƒ”แƒšแƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ”แƒฌแƒแƒ“แƒแƒก แƒ›แƒแƒ’แƒแƒ แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ˜แƒงแƒ!

แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—: "Habr"-แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒคแƒแƒกแƒ“แƒแƒ™แƒšแƒ”แƒ‘แƒ 10 แƒ แƒฃแƒ‘แƒšแƒ˜แƒ“แƒแƒœ Skillbox-แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ™แƒฃแƒ แƒกแƒ–แƒ” แƒฉแƒแƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒกแƒแƒก "Habr" แƒกแƒแƒ แƒ”แƒ™แƒšแƒแƒ›แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—: แƒกแƒแƒ’แƒแƒœแƒ›แƒแƒœแƒแƒ—แƒšแƒ”แƒ‘แƒšแƒ แƒแƒœแƒšแƒแƒ˜แƒœ แƒ™แƒฃแƒ แƒกแƒ˜ "แƒžแƒ แƒแƒคแƒ”แƒกแƒ˜แƒ Java Developer".

แƒ›แƒแƒจ, แƒ แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ MovieSwiftUI-แƒก?

  • แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก API-แƒกแƒ—แƒแƒœ - แƒแƒ›แƒแƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ—แƒแƒœแƒแƒ›แƒ”แƒ“แƒ แƒแƒ•แƒ” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ.
  • แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ–แƒ” แƒ“แƒ แƒแƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒก JSON-แƒก Swift แƒ›แƒแƒ“แƒ”แƒšแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒแƒ“แƒ˜.
  • แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ— แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒš แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒก แƒ“แƒ แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒ›แƒแƒ—.
  • แƒ”แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ iOS-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, iPadOS-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ macOS-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ UX-แƒก แƒแƒ› OS-แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.
  • แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒคแƒ˜แƒšแƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ. แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ“แƒ แƒแƒฆแƒแƒ“แƒ’แƒ”แƒœแƒก แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก.
  • แƒฎแƒ”แƒ“แƒ”แƒ‘แƒ˜, แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒแƒจแƒ™แƒแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ˜แƒ Redux-แƒ˜แƒก แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒแƒ“แƒ˜ แƒแƒฅ แƒชแƒแƒšแƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜แƒ. แƒ›แƒ˜แƒกแƒ˜ แƒกแƒ แƒฃแƒšแƒแƒ“ แƒฅแƒ”แƒจแƒ˜แƒ แƒ”แƒ‘แƒ, แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ แƒ“แƒ แƒ’แƒแƒ“แƒแƒฌแƒ”แƒ แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ.
  • แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก SwiftUI, TabbedView, SegmentedControl, NavigationView, Form, Modal แƒ“แƒ แƒ.แƒจ. แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒก. แƒ˜แƒก แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒš แƒฎแƒ”แƒ“แƒ”แƒ‘แƒก, แƒŸแƒ”แƒกแƒขแƒ”แƒ‘แƒก, UI/UX.

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ SwiftUI-แƒ–แƒ”. แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 1: Dataflow แƒ“แƒ Redux
แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒแƒœแƒ˜แƒ›แƒแƒชแƒ˜แƒ แƒ’แƒšแƒฃแƒ•แƒ˜แƒ, GIF-แƒ˜ แƒชแƒแƒขแƒ แƒฃแƒฎแƒ”แƒจแƒ˜ แƒแƒฆแƒ›แƒแƒฉแƒœแƒ“แƒ

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒ–แƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒ› แƒ“แƒ˜แƒ“แƒ˜ แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒชแƒ แƒ“แƒ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ‘แƒแƒจแƒ˜ แƒ”แƒก แƒ˜แƒงแƒ แƒžแƒแƒ–แƒ˜แƒขแƒ˜แƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒ. แƒกแƒ แƒฃแƒšแƒแƒ“ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒแƒšแƒฃแƒ แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ แƒ›แƒแƒ•แƒแƒฎแƒ”แƒ แƒฎแƒ”, แƒกแƒ”แƒฅแƒขแƒ”แƒ›แƒ‘แƒ”แƒ แƒจแƒ˜ แƒ’แƒแƒ•แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘ AppStore-แƒจแƒ˜, iOS 13-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ แƒแƒšแƒ”แƒšแƒฃแƒ แƒแƒ“.

Redux, BindableObject แƒ“แƒ EnvironmentObject

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ SwiftUI-แƒ–แƒ”. แƒœแƒแƒฌแƒ˜แƒšแƒ˜ 1: Dataflow แƒ“แƒ Redux

แƒ›แƒ” แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— แƒแƒ แƒ˜ แƒฌแƒ”แƒšแƒ˜แƒ แƒ•แƒ›แƒฃแƒจแƒแƒแƒ‘ Redux-แƒ—แƒแƒœ, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ•แƒ”แƒชแƒœแƒแƒ‘แƒ˜ แƒ›แƒแƒก. แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒ›แƒ” แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒ›แƒแƒก แƒฌแƒ˜แƒœแƒ แƒ›แƒฎแƒแƒ แƒ”แƒก แƒ แƒ”แƒแƒ’แƒ˜แƒ แƒ”แƒ‘แƒแƒก แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ–แƒ”, แƒแƒกแƒ”แƒ•แƒ” iOS (Swift) แƒ“แƒ Android (Kotlin) แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒแƒ แƒแƒกแƒ“แƒ แƒแƒก แƒ›แƒ˜แƒœแƒแƒœแƒ˜แƒ Redux-แƒ˜แƒก แƒแƒ แƒฉแƒ”แƒ•แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ SwiftUI แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“. UIKit แƒแƒžแƒจแƒ˜ Redux-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ แƒ—แƒฃแƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒ แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒซแƒ˜แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒ“แƒแƒฎแƒแƒขแƒ•แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒฎแƒ”แƒ“แƒ”แƒ‘แƒ—แƒแƒœ/แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ—แƒแƒœ. แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒ›แƒ” แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ›แƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒœแƒ”แƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒ’แƒ•แƒแƒ แƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ (ReSwift-แƒ˜แƒกแƒ แƒ“แƒ ReKotlin-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—). แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ™แƒแƒ“แƒ˜. แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก (แƒฏแƒ”แƒ ) แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒ.

แฒ™แƒแƒ แƒ’แƒ˜ แƒแƒ›แƒ‘แƒแƒ•แƒ˜! แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜, แƒ แƒแƒ–แƒ”แƒช แƒฃแƒœแƒ“แƒ แƒ˜แƒœแƒ”แƒ แƒ•แƒ˜แƒฃแƒšแƒแƒ— SwiftUI-แƒ˜แƒ— - แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ— Redux-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก - แƒแƒ แƒ˜แƒก แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒ”แƒ‘แƒ˜, แƒจแƒขแƒแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ แƒ”แƒ“แƒฃแƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ˜. แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒแƒกแƒ—แƒแƒœ แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ–แƒ แƒฃแƒœแƒแƒ•แƒก SwiftUI-แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  @EnvironmentObject-แƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ—. แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ BindableObject-แƒ˜แƒ—.

แƒ›แƒ” แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ Swift แƒžแƒแƒ™แƒ”แƒขแƒ˜, 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, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ˜แƒ›แƒžแƒšแƒ”แƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ›แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒแƒ–แƒ”. แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒซแƒšแƒ˜แƒ”แƒ แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ Apple-แƒ˜แƒกแƒ’แƒแƒœ. แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒ แƒ”แƒœแƒ“แƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒชแƒ˜แƒ™แƒšแƒจแƒ˜, 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-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒฏแƒแƒ แƒ˜แƒ›แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒแƒฆแƒ˜แƒฅแƒ›แƒ”แƒ‘แƒ แƒแƒœ แƒ’แƒแƒ›แƒแƒ˜แƒ—แƒ•แƒšแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒ“แƒแƒœ.

แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒชแƒ•แƒšแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒก, แƒ—แƒฃ แƒคแƒ˜แƒšแƒ›แƒ˜แƒก แƒžแƒแƒกแƒขแƒ”แƒ แƒ˜ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ.

แƒ“แƒ แƒ”แƒก แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒฎแƒแƒ–แƒ˜แƒ— แƒ™แƒ”แƒ—แƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ—แƒแƒช แƒฎแƒ”แƒ“แƒ”แƒ‘แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒแƒก แƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ˜แƒ— ReSwift-แƒ—แƒแƒœ iOS-แƒ–แƒ” แƒแƒœ แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ 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!]))
            }
        }
    }
}

แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒš แƒ™แƒแƒ“แƒจแƒ˜ แƒ›แƒ” แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ .onDelete แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก SwiftUI-แƒ“แƒแƒœ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ IP-แƒกแƒ—แƒ•แƒ˜แƒก. แƒ”แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒแƒซแƒšแƒ”แƒ•แƒก แƒกแƒ˜แƒแƒจแƒ˜ แƒ แƒ˜แƒ’แƒก แƒแƒฉแƒ•แƒ”แƒœแƒแƒก แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ iOS-แƒ˜แƒก แƒฌแƒแƒจแƒšแƒ. แƒแƒกแƒ” แƒ แƒแƒ›, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ”แƒฎแƒ”แƒ‘แƒ แƒฌแƒแƒจแƒšแƒ˜แƒก แƒฆแƒ˜แƒšแƒแƒ™แƒก, แƒ˜แƒก แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก แƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ‘แƒก แƒคแƒ˜แƒšแƒ›แƒก แƒกแƒ˜แƒ˜แƒ“แƒแƒœ.

แƒ™แƒแƒ แƒ’แƒแƒ“, แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒกแƒ˜แƒ˜แƒก แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”แƒแƒ‘แƒก BindableObject แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ˜แƒœแƒ”แƒฅแƒชแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช EnvironmentObject, SwiftUI แƒแƒแƒฎแƒšแƒ”แƒ‘แƒก แƒกแƒ˜แƒแƒก, แƒ แƒแƒ“แƒ’แƒแƒœ ForEach แƒแƒกแƒแƒชแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒคแƒ˜แƒšแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒš แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ—แƒแƒœ.

แƒแƒฅ แƒแƒ แƒ˜แƒก MoviesState แƒ แƒ”แƒ“แƒฃแƒฅแƒขแƒแƒ แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜:

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.

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ