Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΡΡΡΡΠ²Π°Ρ
Π½Π° ΡΠ΅ΡΠΈΡΡΠ° Π·Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° Π‘ΡΡΠ·Π° Π½Π° WWDC 2019, ΡΠ΅ΡΠΈΡ
Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΠΏΡ Π΄ΡΠ»Π±ΠΎΠΊΠΎ Π² SwiftUI. ΠΡΠ΅ΠΊΠ°ΡΠ°Ρ
ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² ΡΠ°Π±ΠΎΡΠ° Ρ Π½Π΅Π³ΠΎ ΠΈ ΡΠ΅Π³Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ
Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΠΌ ΠΈΡΡΠΈΠ½ΡΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π° ΡΠΈΡΠΎΠΊ ΠΊΡΡΠ³ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
ΠΠ°ΡΠ΅ΠΊΠΎΡ
Π³ΠΎ MovieSwiftUI - ΡΠΎΠ²Π° Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ ΠΈ ΡΡΠ°ΡΠΈ ΡΠΈΠ»ΠΌΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΡΠ±ΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ Π² ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ Ρ
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ Π²ΠΈ: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° "Habr".
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΠ΅Π»Π΅Π½ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΡΠΎΡΠ΅ΡΠΈΡ Java ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊβ .
Π ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ MovieSwiftUI?
- ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ API - ΠΏΠΎΡΡΠΈ Π²ΡΡΠΊΠΎ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°.
- ΠΠ°ΡΠ΅ΠΆΠ΄Π° Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΏΡΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° JSON Π² ΠΌΠΎΠ΄Π΅Π»Π° Swift, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ
ΠΠΎΠ΄ΠΈΡΡΠ΅ΠΌ . - ΠΠΎΠΊΠ°Π·Π²Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π·Π°ΡΠ΅Π΄Π΅Π½ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ²Π°Π½Π΅, ΠΈ Π³ΠΈ ΠΊΠ΅ΡΠΈΡΠ°.
- Π’ΠΎΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° iOS, iPadOS ΠΈ macOS ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΈΡ UX Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ΅Π·ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ.
- ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° ΡΡΠ·Π΄Π°Π²Π° ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ ΡΠΏΠΈΡΡΡΠΈ Ρ ΡΠΈΠ»ΠΌΠΈ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π°ΠΏΠ°Π·Π²Π° ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ.
- ΠΠ·Π³Π»Π΅Π΄ΠΈΡΠ΅, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΡΠ° ΡΡΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Redux. ΠΠΎΡΠΎΠΊΡΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ ΡΡΠΊ Π΅ Π΅Π΄Π½ΠΎΠΏΠΎΡΠΎΡΠ΅Π½. ΠΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΊΠ΅ΡΠΈΡΠ°Π½, Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²Π΅Π½ ΠΈ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½.
- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° SwiftUI, TabbedView, SegmentedControl, NavigationView, Form, Modal ΠΈ Π΄Ρ. Π’ΠΎΠΉ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ, ΠΆΠ΅ΡΡΠΎΠ²Π΅, UI/UX.
ΠΡΡΡΠ½ΠΎΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡΡΠ° Π΅ Π³Π»Π°Π΄ΠΊΠ°, GIF-ΡΡ ΡΠ΅ ΠΎΠΊΠ°Π·Π° ΠΌΠ°Π»ΠΊΠΎ ΡΡΠ·ΡΠΊ
Π Π°Π±ΠΎΡΠ°ΡΠ° ΠΏΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΌΠΈ Π΄Π°Π΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡ ΠΈ ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ Π±Π΅ΡΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΆΠΈΠ²ΡΠ²Π°Π½Π΅. Π£ΡΠΏΡΡ Π΄Π° Π½Π°ΠΏΠΈΡΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΡΠ΅Π· ΡΠ΅ΠΏΡΠ΅ΠΌΠ²ΡΠΈ ΡΠ΅ Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΡ ΠΈ ΡΠ΅ Π³ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΠΌ Π² AppStore, Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° iOS 13.
Redux, BindableObject ΠΈ EnvironmentObject
Π Π°Π±ΠΎΡΡ Ρ Redux ΠΎΡ ΠΎΠΊΠΎΠ»ΠΎ Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΠΌ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»Π½ΠΎ Π΄ΠΎΠ±ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Ρ Ρ Π½Π΅Π³ΠΎ. ΠΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π²ΡΠ² ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° Π·Π°
ΠΠΈΠΊΠΎΠ³Π° Π½Π΅ ΡΡΠΌ ΡΡΠΆΠ°Π»ΡΠ²Π°Π», ΡΠ΅ ΠΈΠ·Π±ΡΠ°Ρ Redux ΠΊΠ°ΡΠΎ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π½Π° ΠΏΠΎΡΠΎΠΊΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ SwiftUI. ΠΠ°ΠΉ-ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅Π»Π½ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ ΠΏΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Redux Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° UIKit ΡΠ° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ ΠΈ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈΠΌ ΠΊΡΠΌ Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ/ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ. ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°ΠΌ Π΅Π΄ΠΈΠ½ Π²ΠΈΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡ ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡΠΈ (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ReSwift ΠΈ ReKotlin). Π Π°Π±ΠΎΡΠΈ Π΄ΠΎΠ±ΡΠ΅, Π½ΠΎ ΠΈΠΌΠ° Π΄ΠΎΡΡΠ° ΠΊΠΎΠ΄. ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ (Π²ΡΠ΅ ΠΎΡΠ΅) Π½Π΅ Π΅ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄.
ΠΠΎΠ±ΡΠΈ Π½ΠΎΠ²ΠΈΠ½ΠΈ! ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΠ΅ Π½Π΅ΡΠ°, Π·Π° ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ ΠΏΡΠΈ SwiftUI - Π°ΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Redux - ΡΠ° ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΈ, ΡΡΡΡΠΎΡΠ½ΠΈΡ ΠΈ ΡΠ΅Π΄ΡΠΊΡΠΎΡΠΈ. ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Ρ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΡΠ΅ ΠΏΠΎΠ΅ΠΌΠ° ΠΈΠ·ΡΡΠ»ΠΎ ΠΎΡ SwiftUI Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° @EnvironmentObject. Π ΡΠ°ΠΊΠ°, ΠΌΠ°Π³Π°Π·ΠΈΠ½ΡΡ Π·Π°ΠΏΠΎΡΠ²Π° Ρ BindableObject.
Π‘ΡΠ·Π΄Π°Π΄ΠΎΡ
ΠΏΡΠΎΡΡ ΠΏΠ°ΠΊΠ΅Ρ Swift,
ΠΠ°ΠΊ Π΄Π΅ΠΉΡΡΠ²Π° ΡΡ?
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)
}
}
ΠΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, Π²ΠΈΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΠ½Π°ΡΠ° ΠΊΡΡΠΈΡ. Π’ΠΎΠΉ ΡΠ΅ ΠΎΡΠ΅Π½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡΠ° ΡΠΏΠΎΡΠ΅Π΄ ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π²ΡΡΠ½Π΅ Π½ΠΎΠ²ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π² ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΡΠΈΠΏΠ° Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π°Π½Π½ΠΈΡΠ΅.
Π, ΡΡΠΉ ΠΊΠ°ΡΠΎ store Π΅ BindableObject, ΡΠΎΠΉ ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠΈ SwiftUI, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΠΌΡ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ willChange, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΎ ΠΎΡ PassthroughSubject. Π’ΠΎΠ²Π° Π΅ ΡΠ°ΠΊΠ°, Π·Π°ΡΠΎΡΠΎ 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 ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π° ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΡΠ΅ Π½ΠΎΠ²ΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅. ΠΡΠΎ Π΅Π΄ΠΈΠ½ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ.
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 Π·Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅. Π’Π°ΠΊΠ° ΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π΄ΠΎΠΊΠΎΡΠ½Π΅ Π±ΡΡΠΎΠ½Π° Π·Π° ΠΈΠ·ΡΡΠΈΠ²Π°Π½Π΅, ΡΠΎΠΉ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π° ΡΠΈΠ»ΠΌΠ° ΠΎΡ ΡΠΏΠΈΡΡΠΊΠ°.
Π, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎΡΠΎ list ΡΠ΅ ΠΈΠ·Π²Π»ΠΈΡΠ° ΠΎΡ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ BindableObject ΠΈ ΡΠ΅ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ° ΠΊΠ°ΡΠΎ EnvironmentObject, SwiftUI Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ° ΡΠΏΠΈΡΡΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ForEach Π΅ ΡΠ²ΡΡΠ·Π°Π½ Ρ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΎΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ movies.
ΠΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΡΠ΅Π΄ΡΠΊΡΠΎΡΠ° 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 ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠΎΠ±ΠΈΠ»Π΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ PROβ .- ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Pythonβ .- ΠΠ²ΡΠ³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠ· ΡΡΠΌ PRO ΡΠ΅Π± ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊβ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com