WWDC 2019-āĻ āĻ¸ā§āĻā§āĻ āĻ
āĻĢ āĻĻā§āĻ¯ āĻāĻāĻ¨āĻŋāĻ¯āĻŧāĻ¨ āĻ
āĻ§āĻŋāĻŦā§āĻļāĻ¨ā§ āĻ¯ā§āĻ āĻĻā§āĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻŋ SwiftUI-āĻ āĻāĻā§āĻ°āĻāĻžāĻŦā§ āĻĄā§āĻŦ āĻĻā§āĻāĻ¯āĻŧāĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§āĻāĻŋāĨ¤ āĻāĻŽāĻŋ āĻāĻāĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ
āĻ¨ā§āĻ āĻ¸āĻŽāĻ¯āĻŧ āĻŦā§āĻ¯āĻ¯āĻŧ āĻāĻ°ā§āĻāĻŋ āĻāĻŦāĻ āĻāĻāĻ¨ āĻāĻāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻļā§āĻ°ā§ āĻāĻ°ā§āĻāĻŋ āĻ¯āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻŦāĻŋāĻ¸ā§āĻ¤ā§āĻ¤ āĻĒāĻ°āĻŋāĻ¸āĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻŽāĻŋ āĻāĻāĻŋāĻā§ MovieSwiftUI āĻŦāĻ˛ā§āĻāĻŋ - āĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻ¨ā§ āĻāĻ˛āĻā§āĻāĻŋāĻ¤ā§āĻ°āĻā§āĻ˛āĻŋ āĻ
āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻ°āĻžāĻ° āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻ°āĻšā§ āĻ¸āĻāĻā§āĻ°āĻš āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ
ā§āĻ¯āĻžāĻĒ
āĻāĻŽāĻ°āĻž āĻŽāĻ¨ā§ āĻāĻ°āĻŋāĻ¯āĻŧā§ āĻĻāĻŋāĻā§āĻāĻŋ: "Habr"-āĻāĻ° āĻ¸āĻāĻ˛ āĻĒāĻžāĻ āĻāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ - "Habr" āĻĒā§āĻ°āĻāĻžāĻ°āĻŽā§āĻ˛āĻ āĻā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¯ā§āĻā§āĻ¨ā§ Skillbox āĻā§āĻ°ā§āĻ¸ā§ āĻ¨āĻĨāĻŋāĻā§āĻā§āĻ¤ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ 10 āĻ°ā§āĻŦā§āĻ˛ āĻāĻžāĻĄāĻŧāĨ¤
Skillbox āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻāĻ°ā§: āĻļāĻŋāĻā§āĻˇāĻžāĻāĻ¤ āĻ āĻ¨āĻ˛āĻžāĻāĻ¨ āĻā§āĻ°ā§āĻ¸
"āĻĒā§āĻļāĻž āĻāĻžāĻāĻž āĻŦāĻŋāĻāĻžāĻļāĻāĻžāĻ°ā§" .
āĻ¤āĻžāĻšāĻ˛ā§ MovieSwiftUI āĻāĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§?
- API-āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻ¨ā§āĻāĻžāĻ°āĻ ā§āĻ¯āĻžāĻā§āĻ āĻāĻ°ā§ - āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¯ā§āĻā§āĻ¨ā§ āĻāĻ§ā§āĻ¨āĻŋāĻ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻāĻŋ āĻāĻ°ā§āĨ¤
- āĻ
āĻ¨ā§āĻ°ā§āĻ§ā§ āĻ
ā§āĻ¯āĻžāĻ¸āĻŋāĻā§āĻā§āĻ°ā§āĻ¨āĻžāĻ¸ āĻĄā§āĻāĻž āĻ˛ā§āĻĄ āĻāĻ°ā§ āĻāĻŦāĻ JSON-āĻā§ āĻ¸ā§āĻāĻĢāĻ āĻŽāĻĄā§āĻ˛ā§ āĻĒāĻžāĻ°ā§āĻ¸ āĻāĻ°ā§
āĻā§āĻĄā§āĻŦāĻ˛ . - āĻ āĻ¨ā§āĻ°ā§āĻ§ā§ āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻāĻŦāĻŋ āĻĻā§āĻāĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻā§āĻ¯āĻžāĻļā§ āĻāĻ°ā§āĨ¤
- iOS, iPadOS āĻāĻŦāĻ macOS-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ āĻ ā§āĻ¯āĻžāĻĒāĻāĻŋ āĻāĻ OS-āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻ°āĻž UX āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤
- āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻĄā§āĻāĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻāĻŦāĻ āĻ¤āĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻŽā§āĻāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ° āĻĄā§āĻāĻž āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻŦāĻ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻ°ā§āĨ¤
- Redux āĻĒā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻĻā§āĻļā§āĻ¯, āĻāĻĒāĻžāĻĻāĻžāĻ¨ āĻāĻŦāĻ āĻŽāĻĄā§āĻ˛ āĻĒāĻ°āĻŋāĻˇā§āĻāĻžāĻ°āĻāĻžāĻŦā§ āĻāĻ˛āĻžāĻĻāĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻāĻāĻžāĻ¨ā§ āĻĄā§āĻāĻž āĻĒā§āĻ°āĻŦāĻžāĻš āĻāĻāĻŽā§āĻā§āĨ¤ āĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖāĻ°ā§āĻĒā§ āĻā§āĻ¯āĻžāĻļā§, āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻŦāĻ āĻāĻāĻžāĻ°āĻ°āĻžāĻāĻ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
- āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻāĻŋ SwiftUI, TabbedView, Segmented Control, NavigationView, Form, Modal āĻāĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĻ° āĻŽā§āĻ˛āĻŋāĻ āĻāĻĒāĻžāĻĻāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĨ¤ āĻāĻāĻŋ āĻāĻžāĻ¸ā§āĻāĻŽ āĻĻā§āĻļā§āĻ¯, āĻ āĻā§āĻāĻāĻā§āĻāĻŋ, UI/UX āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤
āĻāĻ¸āĻ˛ā§, āĻ
ā§āĻ¯āĻžāĻ¨āĻŋāĻŽā§āĻļāĻ¨ āĻŽāĻ¸ā§āĻŖ, GIF āĻāĻāĻā§ āĻāĻžāĻāĻā§āĻ¨āĻŋ āĻĒāĻ°āĻŋāĻŖāĻ¤
āĻ ā§āĻ¯āĻžāĻĒāĻāĻŋāĻ¤ā§ āĻāĻžāĻ āĻāĻ°āĻž āĻāĻŽāĻžāĻā§ āĻ āĻ¨ā§āĻ āĻ āĻāĻŋāĻā§āĻāĻ¤āĻž āĻĻāĻŋāĻ¯āĻŧā§āĻā§ āĻāĻŦāĻ āĻ¸āĻžāĻŽāĻā§āĻ°āĻŋāĻāĻāĻžāĻŦā§ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻ¤āĻŋāĻŦāĻžāĻāĻ āĻ āĻāĻŋāĻā§āĻāĻ¤āĻž āĻāĻŋāĻ˛āĨ¤ āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻāĻžāĻ°ā§āĻ¯āĻāĻ°ā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻ˛āĻŋāĻāĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¯āĻŧā§āĻāĻŋ, āĻ¸ā§āĻĒā§āĻā§āĻŽā§āĻŦāĻ°ā§ āĻāĻŽāĻŋ āĻāĻāĻŋāĻā§ āĻāĻ¨ā§āĻ¨āĻ¤ āĻāĻ°āĻŦ āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻ ā§āĻ¯āĻžāĻĒāĻ¸ā§āĻā§āĻ°ā§ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°āĻŦ, āĻāĻāĻ āĻ¸āĻžāĻĨā§ iOS 13 āĻĒā§āĻ°āĻāĻžāĻļā§āĻ° āĻ¸āĻžāĻĨā§āĨ¤
Redux, BindableObject āĻāĻŦāĻ EnvironmentObject
āĻāĻŽāĻŋ āĻāĻāĻ¨ āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĻā§āĻ āĻŦāĻāĻ° āĻ§āĻ°ā§ Redux āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻāĻŋ, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻāĻāĻŋāĻ¤ā§ āĻ¤ā§āĻ˛āĻ¨āĻžāĻŽā§āĻ˛āĻāĻāĻžāĻŦā§ āĻĒāĻžāĻ°āĻĻāĻ°ā§āĻļā§āĨ¤ āĻŦāĻŋāĻļā§āĻˇ āĻāĻ°ā§, āĻāĻŽāĻŋ āĻĢā§āĻ°āĻ¨ā§āĻāĻāĻ¨ā§āĻĄā§ āĻāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŋ
āĻāĻāĻāĻŋ SwiftUI āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻ¤ā§āĻ°āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻĄā§āĻāĻž āĻĢā§āĻ˛ā§ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§ Redux āĻŦā§āĻā§ āĻ¨ā§āĻāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻŋ āĻāĻāĻ¨āĻ āĻ āĻ¨ā§āĻļā§āĻāĻ¨āĻž āĻāĻ°āĻŋāĻ¨āĻŋāĨ¤ āĻāĻāĻāĻŋ UIKit āĻ ā§āĻ¯āĻžāĻĒā§ Redux āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻā§āĻ¯āĻžāĻ˛ā§āĻā§āĻāĻŋāĻ āĻ āĻāĻļ āĻšāĻ˛ āĻ¸ā§āĻā§āĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻž āĻāĻŦāĻ āĻĄā§āĻāĻž āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻāĻŦāĻ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻ°āĻž āĻāĻŦāĻ āĻāĻāĻŋāĻā§ āĻāĻĒāĻ¨āĻžāĻ° āĻāĻŋāĻ/āĻāĻŽā§āĻĒā§āĻ¨ā§āĻ¨ā§āĻā§ āĻŽā§āĻ¯āĻžāĻĒ āĻāĻ°āĻžāĨ¤ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻžāĻā§ āĻ¸āĻāĻ¯ā§āĻāĻāĻžāĻ°ā§āĻā§āĻ˛āĻŋāĻ° āĻāĻ āĻ§āĻ°āĻŖā§āĻ° āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ (ReSwift āĻāĻŦāĻ ReKotlin āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§)āĨ¤ āĻāĻžāĻ˛ āĻāĻžāĻ āĻāĻ°ā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻŦā§āĻļ āĻ āĻ¨ā§āĻ āĻā§āĻĄāĨ¤ āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻāĻŋ (āĻāĻāĻ¨āĻ) āĻāĻĒā§āĻ¨ āĻ¸ā§āĻ°ā§āĻ¸ āĻ¨āĻ¯āĻŧāĨ¤
āĻāĻžāĻ˛ āĻāĻŦāĻ°! SwiftUI āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻŋāĻ¨ā§āĻ¤āĻž āĻāĻ°āĻžāĻ° āĻāĻāĻŽāĻžāĻ¤ā§āĻ° āĻāĻŋāĻ¨āĻŋāĻ¸ - āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ Redux āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻŋāĻāĻ˛ā§āĻĒāĻ¨āĻž āĻāĻ°ā§āĻ¨ - āĻ¤āĻž āĻšāĻ˛ āĻ¸ā§āĻā§āĻ°, āĻ¸ā§āĻā§āĻ āĻāĻŦāĻ āĻ°āĻŋāĻĄāĻŋāĻāĻ¸āĻžāĻ°āĨ¤ @EnvironmentObject-āĻā§ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ āĻ¸ā§āĻāĻĢāĻāĻāĻāĻāĻ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§āĻā§āĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻŽāĻŋāĻĨāĻ¸ā§āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖāĻ°ā§āĻĒā§ āĻ¯āĻ¤ā§āĻ¨ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻĻā§āĻāĻžāĻ¨ āĻāĻāĻāĻŋ BindableObject āĻĻāĻŋāĻ¯āĻŧā§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤
āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸ā§āĻāĻĢāĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻāĻŋ,
āĻāĻāĻž āĻāĻŋāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāĻ°ā§?
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 āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°ā§ āĻĨāĻžāĻā§āĻ¨
āĻāĻāĻ¨ āĻāĻĒāĻ¨āĻŋ āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻŋ āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻ¨āĻ¤ā§āĻ¨ āĻ°āĻžāĻā§āĻ¯ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ā§ˇ āĻāĻāĻžāĻ¨ā§ āĻāĻ°āĻ āĻāĻāĻŋāĻ˛ āĻāĻĻāĻžāĻšāĻ°āĻŖāĨ¤
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 āĻāĻ¸āĻ˛ā§ āĻā§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¤āĻž āĻāĻžāĻ¨ā§āĨ¤ āĻāĻāĻŋ āĻāĻ°āĻ āĻāĻā§āĻ°āĻāĻžāĻŦā§ āĻŦā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻŋ āĻŽā§āĻ˛ā§āĻ¯āĻŦāĻžāĻ¨
Skillbox āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻāĻ°ā§:
- āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻā§āĻ°ā§āĻ¸
"āĻŽā§āĻŦāĻžāĻāĻ˛ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ° āĻĒā§āĻ°ā§" .- āĻ āĻ¨āĻ˛āĻžāĻāĻ¨ āĻā§āĻ°ā§āĻ¸ā§āĻ° āĻāĻŦā§āĻĻāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§
"āĻĒāĻžāĻāĻĨāĻ¨ āĻĄā§āĻāĻž āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻ" .- āĻĻā§āĻ āĻŦāĻāĻ°ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻā§āĻ°ā§āĻ¸
"āĻāĻŽāĻŋ āĻāĻāĻāĻ¨ āĻĒā§āĻ°ā§ āĻāĻ¯āĻŧā§āĻŦ āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°" .
āĻāĻ¤ā§āĻ¸: www.habr.com