SwiftUI āĻ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸāĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 1: āĻĄā§‡āĻŸāĻžāĻĢā§āĻ˛ā§‹ āĻāĻŦāĻ‚ āĻ°ā§‡āĻĄāĻžāĻ•ā§āĻ¸

SwiftUI āĻ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸāĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 1: āĻĄā§‡āĻŸāĻžāĻĢā§āĻ˛ā§‹ āĻāĻŦāĻ‚ āĻ°ā§‡āĻĄāĻžāĻ•ā§āĻ¸

WWDC 2019-āĻ āĻ¸ā§āĻŸā§‡āĻŸ āĻ…āĻĢ āĻĻā§āĻ¯ āĻ‡āĻ‰āĻ¨āĻŋāĻ¯āĻŧāĻ¨ āĻ…āĻ§āĻŋāĻŦā§‡āĻļāĻ¨ā§‡ āĻ¯ā§‹āĻ— āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻŋ SwiftUI-āĻ āĻ—āĻ­ā§€āĻ°āĻ­āĻžāĻŦā§‡ āĻĄā§āĻŦ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤ āĻ†āĻŽāĻŋ āĻāĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§‡āĻ• āĻ¸āĻŽāĻ¯āĻŧ āĻŦā§āĻ¯āĻ¯āĻŧ āĻ•āĻ°ā§‡āĻ›āĻŋ āĻāĻŦāĻ‚ āĻāĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ›āĻŋ āĻ¯āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻŦāĻŋāĻ¸ā§āĻ¤ā§ƒāĻ¤ āĻĒāĻ°āĻŋāĻ¸āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§‹āĻ—ā§€ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ†āĻŽāĻŋ āĻāĻŸāĻŋāĻ•ā§‡ MovieSwiftUI āĻŦāĻ˛ā§‡āĻ›āĻŋ - āĻāĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻšāĻ˛āĻšā§āĻšāĻŋāĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšā§‡ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒ TMDB API. āĻ†āĻŽāĻŋ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻšāĻ˛āĻšā§āĻšāĻŋāĻ¤ā§āĻ° āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻāĻŽāĻ¨āĻ•āĻŋ āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ¯āĻĻāĻŋāĻ“ āĻ…āĻ¨ā§‡āĻ• āĻ†āĻ—ā§‡āĨ¤ āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨ā§€ āĻ–ā§āĻŦ āĻ•āĻŽāĻ‡ āĻļā§€āĻ¤āĻ˛ āĻŦāĻ˛āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŦā§‡āĻĻāĻ¨ āĻ›āĻŋāĻ˛!

āĻ†āĻŽāĻ°āĻž āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻāĻŋāĻšā§āĻ›āĻŋ: "Habr"-āĻāĻ° āĻ¸āĻ•āĻ˛ āĻĒāĻžāĻ āĻ•āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ - "Habr" āĻĒā§āĻ°āĻšāĻžāĻ°āĻŽā§‚āĻ˛āĻ• āĻ•ā§‹āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ Skillbox āĻ•ā§‹āĻ°ā§āĻ¸ā§‡ āĻ¨āĻĨāĻŋāĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ 10 āĻ°ā§āĻŦā§‡āĻ˛ āĻ›āĻžāĻĄāĻŧāĨ¤

Skillbox āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°ā§‡: āĻļāĻŋāĻ•ā§āĻˇāĻžāĻ—āĻ¤ āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ•ā§‹āĻ°ā§āĻ¸ "āĻĒā§‡āĻļāĻž āĻœāĻžāĻ­āĻž āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€".

āĻ¤āĻžāĻšāĻ˛ā§‡ MovieSwiftUI āĻ•āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡?

  • API-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°ā§‡ - āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻāĻŸāĻŋ āĻ•āĻ°ā§‡āĨ¤
  • āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĄā§‡āĻŸāĻž āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ JSON-āĻ•ā§‡ āĻ¸ā§āĻ‡āĻĢāĻŸ āĻŽāĻĄā§‡āĻ˛ā§‡ āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°ā§‡ āĻ•ā§‹āĻĄā§‡āĻŦāĻ˛.
  • āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻ›āĻŦāĻŋ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ•ā§āĻ¯āĻžāĻļā§‡ āĻ•āĻ°ā§‡āĨ¤
  • iOS, iPadOS āĻāĻŦāĻ‚ macOS-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ‡ āĻ…ā§āĻ¯āĻžāĻĒāĻŸāĻŋ āĻāĻ‡ OS-āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§‡āĻ°āĻž UX āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤
  • āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻĄā§‡āĻŸāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻŽā§āĻ­āĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻĄā§‡āĻŸāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°ā§‡āĨ¤
  • Redux āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĻā§ƒāĻļā§āĻ¯, āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻāĻŦāĻ‚ āĻŽāĻĄā§‡āĻ˛ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°āĻ­āĻžāĻŦā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻŦāĻžāĻš āĻāĻ•āĻŽā§āĻ–ā§€āĨ¤ āĻāĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻ•ā§āĻ¯āĻžāĻļā§‡, āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻŦāĻ‚ āĻ“āĻ­āĻžāĻ°āĻ°āĻžāĻ‡āĻŸ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤
  • āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ SwiftUI, TabbedView, Segmented Control, NavigationView, Form, Modal āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĻ° āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĻā§ƒāĻļā§āĻ¯, āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ, UI/UX āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤

SwiftUI āĻ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸāĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 1: āĻĄā§‡āĻŸāĻžāĻĢā§āĻ˛ā§‹ āĻāĻŦāĻ‚ āĻ°ā§‡āĻĄāĻžāĻ•ā§āĻ¸
āĻ†āĻ¸āĻ˛ā§‡, āĻ…ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§‡āĻļāĻ¨ āĻŽāĻ¸ā§ƒāĻŖ, GIF āĻāĻ•āĻŸā§ āĻāĻžāĻāĻ•ā§āĻ¨āĻŋ āĻĒāĻ°āĻŋāĻŖāĻ¤

āĻ…ā§āĻ¯āĻžāĻĒāĻŸāĻŋāĻ¤ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻ†āĻŽāĻžāĻ•ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻĻāĻŋāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ¸āĻžāĻŽāĻ—ā§āĻ°āĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŦāĻžāĻšāĻ• āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻ›āĻŋāĻ˛āĨ¤ āĻ†āĻŽāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ°ā§€ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋ, āĻ¸ā§‡āĻĒā§āĻŸā§‡āĻŽā§āĻŦāĻ°ā§‡ āĻ†āĻŽāĻŋ āĻāĻŸāĻŋāĻ•ā§‡ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻŦ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻĒāĻ¸ā§āĻŸā§‹āĻ°ā§‡ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻŦ, āĻāĻ•āĻ‡ āĻ¸āĻžāĻĨā§‡ iOS 13 āĻĒā§āĻ°āĻ•āĻžāĻļā§‡āĻ° āĻ¸āĻžāĻĨā§‡āĨ¤

Redux, BindableObject āĻāĻŦāĻ‚ EnvironmentObject

SwiftUI āĻ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸāĨ¤ āĻĒāĻžāĻ°ā§āĻŸ 1: āĻĄā§‡āĻŸāĻžāĻĢā§āĻ˛ā§‹ āĻāĻŦāĻ‚ āĻ°ā§‡āĻĄāĻžāĻ•ā§āĻ¸

āĻ†āĻŽāĻŋ āĻāĻ–āĻ¨ āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĻā§āĻ‡ āĻŦāĻ›āĻ° āĻ§āĻ°ā§‡ Redux āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ›āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ¤ā§āĻ˛āĻ¨āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻžāĻ°āĻĻāĻ°ā§āĻļā§€āĨ¤ āĻŦāĻŋāĻļā§‡āĻˇ āĻ•āĻ°ā§‡, āĻ†āĻŽāĻŋ āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄā§‡ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸ, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻ¨ā§‡āĻŸāĻŋāĻ­ āĻ†āĻ‡āĻ“āĻāĻ¸ (āĻ¸ā§āĻ‡āĻĢāĻŸ) āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ (āĻ•ā§‹āĻŸāĻ˛āĻŋāĻ¨) āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĨ¤

āĻāĻ•āĻŸāĻŋ SwiftUI āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄā§‡āĻŸāĻž āĻĢā§āĻ˛ā§‹ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§‡ Redux āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻŋ āĻ•āĻ–āĻ¨āĻ‡ āĻ…āĻ¨ā§āĻļā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻŋāĻ¨āĻŋāĨ¤ āĻāĻ•āĻŸāĻŋ UIKit āĻ…ā§āĻ¯āĻžāĻĒā§‡ Redux āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻšā§āĻ¯āĻžāĻ˛ā§‡āĻžā§āĻœāĻŋāĻ‚ āĻ…āĻ‚āĻļ āĻšāĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ•ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ­āĻŋāĻ‰/āĻ•āĻŽā§āĻĒā§‹āĻ¨ā§‡āĻ¨ā§āĻŸā§‡ āĻŽā§āĻ¯āĻžāĻĒ āĻ•āĻ°āĻžāĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻžāĻ•ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻ•āĻžāĻ°ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ• āĻ§āĻ°āĻŖā§‡āĻ° āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ (ReSwift āĻāĻŦāĻ‚ ReKotlin āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡)āĨ¤ āĻ­āĻžāĻ˛ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻŦā§‡āĻļ āĻ…āĻ¨ā§‡āĻ• āĻ•ā§‹āĻĄāĨ¤ āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻŸāĻŋ (āĻāĻ–āĻ¨āĻ“) āĻ“āĻĒā§‡āĻ¨ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻ¨āĻ¯āĻŧāĨ¤

āĻ­āĻžāĻ˛ āĻ–āĻŦāĻ°! SwiftUI āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ°āĻžāĻ° āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻœāĻŋāĻ¨āĻŋāĻ¸ - āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ Redux āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨ - āĻ¤āĻž āĻšāĻ˛ āĻ¸ā§āĻŸā§‹āĻ°, āĻ¸ā§āĻŸā§‡āĻŸ āĻāĻŦāĻ‚ āĻ°āĻŋāĻĄāĻŋāĻ‰āĻ¸āĻžāĻ°āĨ¤ @EnvironmentObject-āĻ•ā§‡ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ āĻ¸ā§āĻ‡āĻĢāĻŸāĻ‡āĻ‰āĻ†āĻ‡ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻ¯āĻ¤ā§āĻ¨ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻĻā§‹āĻ•āĻžāĻ¨ āĻāĻ•āĻŸāĻŋ BindableObject āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤

āĻ†āĻŽāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸ā§āĻ‡āĻĢāĻŸ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ¸ā§āĻ‡āĻĢāĻŸāĻ‡āĻ‰āĻ†āĻ‡āĻĢā§āĻ˛āĻžāĻ•ā§āĻ¸, āĻ¯āĻž 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 āĻ•ā§‡ āĻœāĻžāĻ¨āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻŦā§‡ āĻ¯āĻ–āĻ¨ āĻĒāĻžāĻ¸āĻĨā§āĻ°ā§ āĻ¸āĻžāĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ 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 āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻš, āĻ†āĻĒāĻ¨āĻŋ 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!]))
            }
        }
    }
}

āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ•ā§‹āĻĄā§‡, āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ†āĻ‡āĻĒāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ SwiftUI āĻĨā§‡āĻ•ā§‡ .onDelete āĻ…ā§āĻ¯āĻžāĻ•āĻļāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ›āĻŋāĨ¤ āĻāĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻŸāĻŋāĻ•ā§‡ āĻŽā§‹āĻ›āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨