Projects of 100 Days of SwiftUI


Projects introduction of online course "100 Dats of SwiftUI" written by Paul Hudson

YEAR 2022

This airtcle records all projects I made during 100 Days of SwiftUI. Project title with Challenge of Day XX means this project is a homework part of course. Which named, designed, developed all by myself.


This app can calculate expenses divied by assigned people and tips

LengthConversion (Challenge of Day 19)

  • Using Measurement() and .convert() to handle unit value convertion.
  • Using .menu pickerstyle to simply input field design.


  • Using material translucent to make beautiful background effect. Read more of my blog
  • Using custom view and custom view modifier to build components.
  • Basic accessibility support for VoiceOver.

RockPaperScissors (Challenge of Day 25)

  • Using custom view and custom view modifier to build components.
  • Using generic of ShapeStyle to scale up the flexibility of custom components.
  • Using ProgressView and adjust the appearance.
  • Dribble shot which is referenced when I design the interface.


  • Using CreateML and Regression to generate machine learning model. CreateML project
  • Using DateComponents() to record hours.
  • Using custom binding to implement complex binding situation.


  • Using Bundle.main.url to accesss local resource.
  • Using UITextChecker() to check real word.
  • Using withAnimation (explicity animation) to create animate effect.
  • Using fatalError() to terminate app running.

Edutainment (Challenge of Day 35)

  • Custimization of segemented picker style.
  • Optimization of dark mode.
  • Dribble shot which is referenced when I design the interface.
  • Character illustrations are come from EmojiOne 2.2.7


  • Using UserDefaults to save simple data on the device.
  • Using JSONEncoder() and JSONDecoder() to process data.
  • Using ObservableObject and @Published to share data cross multiple SwiftUI view.


  • Using generic to add a extension to Bundle class, handle with codable of different data type.
  • Using LazyVGrid to make grid layout view.
  • Using .preferredColorScheme to make app will display dark mode always.

HabitTracking (Challenge of Day 47)

  • Using Shape and Canvas to draw graph interface, and implement the animation of graph.
  • Using extension of Color to create app theme color set.
  • Optimization of both light mode and dark mode.
  • Dribble shot which is referenced when I design the interface.


  • Using @FocusState and "Done" button to close keyboard of multiple text input. read more of my blog.
  • Using CodingKeys to handle with custom codable of class, for the reason of Codable protocol can't using along with @Published.
  • Networking with URLRequest and POST method.


  • Using Core Data to save data to device.
  • Using @FetchedRequest to accesss data which saved in device.
  • Using accessibilityAdjustableAction to design interaction raiting component when VoiceOver is enable.

FriendFace (Challenge of Day 60)

  • Using async and task to complete networking function.
  • Using Core Data to cache data to improve user experience.
  • Using Core Data and manual model class to add custimization funcions.

YourReading (Challenge of personal exercise)

  • Using Google Book API to search book by ISBN number.
  • Using AsyncImage to access remote image.
  • Using many-to-many relations to combined entities of Core Data.
  • Using EditMode to handle customize List edit/delete appearance. see more of my blog
  • Prototype site which is made with Framework7


  • Using CIFilter and CoreImage to proccess image filter.
  • Using UIViewControllerRepresentable and coordinator to add UIKit component to SwiftUI
  • Using confirmationDialog to add action sheet to app.


  • Using Map and MapAnnotation to make location marked in MapKit.
  • Using @StateObject and MVC structure of SwiftUI.
  • Using FileManager and .documentDirectory to save data to local device.
  • Using LocalAuthentication (TouchID/FaceID) to protect private data.

FaceList (Challenge of Day 77)

  • Using Core Image to detect face and crop it.
  • Using LAError and .alert(item: ) to show error message when FaceID/TouchID authenicate fail.
  • Saving the location when user create a item (photo's location or device's location) by CoreLocation and PHAssset.


  • NPM installing and usage.
  • Usage of TabView and SwipeAction.
  • Using .environmentObject to pass data by environment layer.
  • Using UserNotification to implement Local notification.


  • Using @Environment to access environment values such as VoiceOver, differentiateWithoutColor to optimize accessibility
  • Using .gesture() to create gesture interactive effect when swipe a card.
  • Using UINotificationFeedbackGenerator() to implement haptics effect when the answer is wrong.

PickerWheel (Challenge of Day 95)

  • Using Canvas and Path to draw wheel panel
  • Using Timer.publish to make spinning animation consistent.
  • Detecting gesturing velocity to decide spinning speed.


  • Using splitted view to making optimization of iPad.
  • Using horizontalSizeClass and dynamicTypeSize to optimize layout between the large device and small device.
  • Using objectWillChange.send() to implement manually ObservableObject published (because @Published can't sent change when item is modified)