Chapter 1: SwiftUI - A new Beginning
- Why a New UI framework?
- SwiftUI Principles
- Declarative vs Imperative
- State Management
- Composition over Inheritance
- Everything is a View
- UIs are a function of their state
- A quick tour of SwiftUI
- Creating a new app
- Anatomy of a SwiftUI app
- Two-way tooling
- Adding your first button
- Print hello to the console
- Explain live mode (need to turn on debug mode so you can
see console output while in preview)
- A brief overview of statement management
Use code editor and preview pane to update the hello world app to allow the user to give their name
- TextField, Label, (Button)
- @State to bind the TextField input
- Bind Label, so it gets updated automatically
- Run the app in live preview
Chapter 2: Getting Started with SwiftUI
Building Blocks
- Views
- View Modifiers
- Property Wrappers
- Simple UI Controls
Lists
Navigation
Composing UIs from simple UI elements
- Building a list row
- Making it reusable
- extracting parts into separate structs / views
- using ViewBuilders (properties / functions)
Chapter 3: SwiftUI Foundation
- Opaque return types
- Implicit returns from single-expression functions
- Function Builders
- View Builders
- Multiple Trailing Closures
- Domain Specific languages
- Property Wrappers
- The View Life Cycle
Chapter 4: State Management
- Managing State with Property Wrappers @State
@ObservableObject @ObservedObject
@StateObject
@EnvironmentObject
- SwiftUI Patterns and State Management
- Pattern: Drill-Down Navigation
- Pattern: Input form
- Pattern: Lookup field
- Pattern: Local state in a single dialog
- View Lifecycle
- See Michael Long's article
- Maybe even build some sort of introspector?
- Build my own debugging utilities
Chapter 5: Building Input Forms
- Building simple forms
Build a simple form with a couple of simple input fields. - Building advanced forms
Look-up fields
Drill-down
In-place editing (e.g. date picker) Sections
Forms and Data Binding / State Management
Building a sign-up form
Username
Password / Repetition Validation
Come up with a non-Combine version for the following rules:
- Do the passwords match?
- Password strong enough?
- Username long enough?
- Username still available?
Chapter 6: Functional Reactive Programming and Combine
- Introduction to Functional Reactive Programming
- What is it?
- Why is it so cool / hot?
- How can it help to make your apps better and more error-free
- Core Combine Concepts Publishers
Subscribers
Operators
- Combine Visualised
- Marble Diagrams
- Show some Combine operators as Marble Diagrams
Chapter 7: Combine and SwiftUI
Driving UI state
Input validation using Combine
- verify that the passwords match
- verify username length
- verify username is still available
- verify password meets password complexity rules
- show error messages for the individual error conditions
- combine all the above into a single state that drives the enabled
state of the sign-up button
- Optimise our code
- use debounce to throttle the number of calls on our fake backend
- ensure UI updates happen on the main thread (use receiveOn)
Closure - Combine makes our code more maintainable.
- It helps to decouple business logic from our UI
- This also makes our code more testable
Chapter 8: Testing Combine Code
- Writing tests for asynchronous code
- Mocking parts of your implementation
- Some useful helpers
Chapter 9: Advanced SwiftUI UIs
LazyVGrid / LazyHGrid
Outlines
Chapter 10: Advanced SwiftUI - Building Reusable UI Components
- Keep it lean and mean
- Extracting functionality into sub-views
- Using ViewBuilders to organise view code within a screen
- Creating Container Components
- Making your views customisable
- Packaging your components using Swift Package Manager
- Integrating views and view modifiers with the Xcode library
Chapter 11: Building a Complete App with SwiftUI and Combine
- Features of the app
- Data Model
Chapter 12: Displaying a list of books
- Building a list cell from simple UI views
- Compose a list view
- Make your code reusable
Chapter 13: Implementing a search screen
Implementing a re-usable search bar
- Designing the UI
- Data Binding and State Management
- Making the view re-usable
Connecting to the OpenLibrary API
- Searching book titles
- Using Combine to improve working with the API
- Debounce
- Mapping JSON Data
- Error handling
- Automatic retries
Chapter 14: Drill-Down Navigation and State Management
Implementing a book details / edit screen
Drill-down navigation pattern
Chapter 15: Persisting Data in Firestore
- What is Firebase?
- What is Firestore?
- NoSQL
Real-time Sync
- Mapping our data model to Firestore
- Reading and writing data from / to Firestore
- Implementing Combine Publishers for Firestore
Chapter 16: App Store Hero Animation
- Magic Move
- SwiftUI Magic Move Animations
- Explain how they work
- Transition the current list view to make use of animations
- Distribute your code
Appendix A: An Overview of all SwiftUI Views