Skip to content

100 Days of SwiftUI: a series around the existing work on Hacking with Swift, all designed to learn SwiftUI.

Notifications You must be signed in to change notification settings

alemohamad/100-Days-of-SwiftUI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

72 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

100 Days of SwiftUI

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

About

100 Days of SwiftUI: a series around the existing work on Hacking with Swift, all designed to learn SwiftUI.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages