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