https://www.hackingwithswift.com/100/swiftui
Days 1 to 15 - Introduction to Swift
Day 16 - Project 1, part one
- WeSplit: Introduction
- Understanding the basic structure of a SwiftUI app
- Creating a form
- Adding a navigation bar
- Modifying program state
- Binding state to user interface controls
- Creating views in a loop
Day 17 - Project 1, part two
- Reading text from the user with TextField
- Creating pickers in a form
- Adding a segmented control for tip percentages
- Calculating the total per person
Day 18 - Project 1, part three
- Wrap up
- Review for Project 1: WeSplit
Day 19 - Challenge day
Day 20 - Project 2, part 1
- Guess the Flag: Introduction
- Using stacks to arrange views
- Colors and frames
- Gradients
- Buttons and images
- Showing alert messages
Day 21 - Project 2, part 2
- Stacking up buttons
- Showing the player’s score with an alert
- Styling our flags
Day 22 - Project 2, part 3
- Wrap up
- Review for Project 2: Guess the Flag
Day 23 - Project 3, part 1
- Views and modifiers: Introduction
- Why does SwiftUI use structs for views?
- What is behind the main SwiftUI view?
- Why modifier order matters
- Why does SwiftUI use “some View” for its view type?
- Conditional modifiers
- Environment modifiers
- Views as properties
- View composition
- Custom modifiers
- Custom containers
Day 24 - Project 3, part 2
- Wrap up
- Review for Project 3: Views and Modifiers
Day 25 - Milestone: Projects 1-3
- What you learned
- Key points
- Challenge
Day 26 - Project 4, part 1
- BetterRest: Introduction
- Entering numbers with Stepper
- Selecting dates and times with DatePicker
- Working with dates
- Training a model with Create ML
Day 27 - Project 4, part 2
- Building a basic layout
- Connecting SwiftUI to Core ML
- Cleaning up the user interface
Day 28 - Project 4, part 3
- Wrap up
- Review for Project 4: BetterRest
Day 29 - Project 5, part 1
- Word Scramble: Introduction
- Introducing List, your best friend
- Loading resources from your app bundle
- Working with strings
Day 30 - Project 5, part 2
- Adding to a list of words
- Running code when our app launches
- Validating words with UITextChecker
Day 31 - Project 5, part 3
- Wrap up
- Review for Project 5: Word Scramble
Day 32 - Project 6, part 1
- Animation: Introduction
- Creating implicit animations
- Customizing animations in SwiftUI
- Animating bindings
- Creating explicit animations
Day 33 - Project 6, part 2
- Controlling the animation stack
- Animating gestures
- Showing and hiding views with transitions
- Building custom transitions using ViewModifier
Day 34 - Project 6, part 3
- Wrap up
- Review for Project 6: Animation
Day 35 - Milestone: Projects 4-6
- What you learned
- Key points
- Challenge
Day 36 - Project 7, part 1
- iExpense: Introduction
- Why @State only works with structs
- Sharing SwiftUI state with @ObservedObject
- Showing and hiding views
- Deleting items using onDelete()
- Storing user settings with UserDefaults
- Archiving Swift objects with Codable
Day 37 - Project 7, part 2
- Building a list we can delete from
- Working with Identifiable items in SwiftUI
- Sharing an observed object with a new view
- Making changes permanent with UserDefaults
- Final polish
Day 38 - Project 7, part 3
- Wrap up
- Review for Project 7: iExpense
Day 39 - Project 8, part 1
- Moonshot: Introduction
- Resizing images to fit the screen using GeometryReader
- How ScrollView lets us work with scrolling data
- Pushing new views onto the stack using NavigationLink
- Working with hierarchical Codable data
Day 40 - Project 8, part 2
- Loading a specific kind of Codable data
- Using generics to load any kind of Codable data
- Formatting our mission view
Day 41 - Project 8, part 3
- Showing mission details with ScrollView and GeometryReader
- Merging Codable structs using first(where:)
- Fixing problems with buttonStyle() and layoutPriority()
Day 42 - Project 8, part 4
- Wrap up
- Review for Project 8: Moonshot
Day 43 - Project 9, part 1
- Drawing: Introduction
- Creating custom paths with SwiftUI
- Paths vs shapes in SwiftUI
- Adding strokeBorder() support with InsettableShape
Day 44 - Project 9, part 2
- Transforming shapes using CGAffineTransform and even-odd fills
- Creative borders and fills using ImagePaint
- Enabling high-performance Metal rendering with drawingGroup()
Day 45 - Project 9, part 3
- Special effects in SwiftUI: blurs, blending, and more
- Animating simple shapes with animatableData
- Animating complex shapes with AnimatablePair
- Creating a spirograph with SwiftUI
Day 46 - Project 9, part 4
- Wrap up
- Review for Project 9: Drawing
Day 47 - Milestone: Projects 7-9
- What you learned
- Key points
- Challenge
Day 49 - Project 10, part 1
- Cupcake Corner: Introduction
- Adding Codable conformance for @Published properties
- Sending and receiving Codable data with URLSession and SwiftUI
- Validating and disabling forms
Day 50 - Project 10, part 2
- Taking basic order details
- Checking for a valid address
- Preparing for checkout
Day 51 - Project 10, part 3
- Encoding an ObservableObject class
- Sending and receiving orders over the internet
Day 52 - Project 10, part 4
- Wrap up
- Review for Project 10: Cupcake Corner
Day 53 - Project 11, part 1
- Bookworm: Introduction
- Creating a custom component with @Binding
- Using size classes with AnyView type erasure
- How to combine Core Data and SwiftUI
Day 54 - Project 11, part 2
- Creating books with Core Data
- Adding a custom star rating component
- Building a list with @FetchRequest
Day 55 - Project 11, part 3
- Showing book details
- Sorting fetch requests with NSSortDescriptor
- Deleting from a Core Data fetch request
- Using an alert to pop a NavigationLink programmatically
Day 56 - Project 11, part 4
- Bookworm: Wrap up
- Review for Project 11: Bookworm
Day 57 - Project 12, part 1
- Core Data: Introduction
- Why does .self work for ForEach?
- Creating NSManagedObject subclasses
- Conditional saving of NSManagedObjectContext
- Ensuring Core Data objects are unique using constraints
Day 58 - Project 12, part 2
- Filtering @FetchRequest using NSPredicate
- Dynamically filtering @FetchRequest with SwiftUI
- One-to-many relationships with Core Data, SwiftUI, and @FetchRequest
Day 59 - Project 12, part 3
- Core Data: Wrap up
- Review for Project 12: Core Data
Day 60 - Milestone: Projects 10-12
- What you learned
- Key points
- Challenge
Day 61 - Time for Core Data
Day 62 - Project 13, part 1
- Instafilter: Introduction
- How property wrappers become structs
- Creating custom bindings in SwiftUI
- Showing multiple options with ActionSheet
Day 63 - Project 13, part 2
- Integrating Core Image with SwiftUI
- Wrapping a UIViewController in a SwiftUI view
Day 64 - Project 13, part 3
- Using coordinators to manage SwiftUI view controllers
- How to save images to the user’s photo library
Day 65 - Project 13, part 4
- Building our basic UI
- Importing an image into SwiftUI using UIImagePickerController
- Basic image filtering using Core Image
Day 66 - Project 13, part 5
- Customizing our filter using ActionSheet
- Saving the filtered image using UIImageWriteToSavedPhotosAlbum()
Day 67 - Project 13, part 6
- Instafilter: Wrap up
- Review for Project 13: Instafilter
Day 68 - Project 14, part 1
- Bucket List: Introduction
- Adding conformance to Comparable for custom types
- Writing data to the documents directory
- Switching view states with enums
Day 69 - Project 14, part 2
- Integrating MapKit with SwiftUI
- Communicating with a MapKit coordinator
- Using Touch ID and Face ID with SwiftUI
Day 70 - Project 14, part 3
- Advanced MKMapView with SwiftUI
- Adding annotations to MKMapView
Day 71 - Project 14, part 4
- Extending existing types to support ObservableObject
- Downloading data from Wikipedia
- Sorting Wikipedia results
Day 72 - Project 14, part 5
- Making someone else’s class conform to Codable
- Locking our UI behind Face ID
Day 73 - Project 14, part 6
- Bucket List: Wrap up
- Review for Project 14: Bucket List
Day 74 - Project 15, part 1
- Accessibility: Introduction
- Identifying views with useful labels
- Hiding and grouping accessibility data
- Reading the value of controls
Day 75 - Project 15, part 2
- Fixing Guess the Flag
- Fixing Word Scramble
- Fixing Bookworm
Day 76 - Project 15, part 3
- Accessibility: Wrap up
- Review for Project 15: Accessibility
Day 77 - Milestone: Projects 13-15
- What you learned
- Key points
- Challenge
Day 78 - Time for MapKit
Day 79 - Project 16, part 1
- Hot Prospects: Introduction
- Reading custom values from the environment with @EnvironmentObject
- Creating tabs with TabView and tabItem()
Day 80 - Project 16, part 2
- Understanding Swift’s Result type
- Manually publishing ObservableObject changes
- Controlling image interpolation in SwiftUI
Day 81 - Project 16, part 3
- Creating context menus
- Scheduling local notifications
- Adding Swift package dependencies in Xcode
Day 82 - Project 16, part 4
- Building our tab bar
- Sharing data across tabs using @EnvironmentObject
- Dynamically filtering a SwiftUI List
Day 83 - Project 16, part 5
- Generating and scaling up a QR code
- Scanning QR codes with SwiftUI
- Adding options with a context menu
Day 84 - Project 16, part 6
- Saving and loading data with UserDefaults
- Posting notifications to the lock screen
Day 85 - Project 16, part 7
- Hot Prospects: Wrap up
- Review for Project 16: Hot Prospects
Day 86 - Project 17, part 1
- Flashzilla: Introduction
- How to use gestures in SwiftUI
- Making vibrations with UINotificationFeedbackGenerator and Core Haptics
- Disabling user interactivity with allowsHitTesting()
Day 87 - Project 17, part 2
- Triggering events repeatedly using a timer
- How to be notified when your SwiftUI app moves to the background
- Supporting specific accessibility needs with SwiftUI
Day 88 - Project 17, part 3
- Designing a single card view
- Building a stack of cards
- Moving views with DragGesture and offset()
Day 89 - Project 17, part 4
- Coloring views as we swipe
- Counting down with a Timer
- Ending the app with allowsHitTesting()
Day 90 - Project 17, part 5
- Making iPhones vibrate with UINotificationFeedbackGenerator
- Fixing the bugs
- Adding and deleting cards
Day 91 - Project 17, part 6
- Flashzilla: Wrap up
- Review for Project 17: Flashzilla
Day 92 - Project 18, part 1
- Layout and geometry: Introduction
- How layout works in SwiftUI
- Alignment and alignment guides
- How to create a custom alignment guide
Day 93 - Project 18, part 2
- Absolute positioning for SwiftUI views
- Understanding frames and coordinates inside GeometryReader
- ScrollView effects using GeometryReader
Day 94 - Project 18, part 3
- Layout and geometry: Wrap up
- Review for Project 18: Layout and geometry
Day 95 - Milestone: Projects 16-18
- What you learned
- Key points
- Challenge
Day 96 - Project 19, part 1
- SnowSeeker: Introduction
- Working with two side by side views in SwiftUI
- Using alert() and sheet() with optionals
- Using groups as transparent layout containers
Day 97 - Project 19, part 2
- Building a primary list of items
- Making NavigationView work in landscape
- Creating a secondary view for NavigationView
Day 98 - Project 19, part 3
- Changing a view’s layout in response to size classes
- Binding an alert to an optional string
- Letting the user mark favorites
Day 99 - Project 19, part 4
- SnowSeeker: Wrap up
- Review for Project 19: SnowSeeker