

This course was originally hosted on Teachable as a paid course. Unfortunately they have increased their pricing to a point where it is no longer feasible for me to continue offering this course. Prices have increased so much and in order for me to maintain this course I would have to create a new course and charge a higher price which goes against my mission to provide affordable education. Instead, I will be focusing my efforts on my YouTube channel where I will continue to provide free Swift and SwiftUI tutorials.
For this reason, I am making the course content available for free to anyone who is interested.
Learn Swift and SwiftUI by building one app that ships across macOS (menu bar), iOS, Widgets, and watchOS. The course is structured so each lesson builds on the last, emphasizing practical, incremental progress.
Mac Menu Bar app — choose language and category to present jokes in your menu bar.
iOS app — all Mac features plus translation to multiple languages and a joke distribution chart.
Widgets — configurable widgets that refresh hourly with your chosen language and category.
watchOS app — select a category/language and create a launchable complication.
Course Overview and Goals (5:28)
1.0 Introduction (0:44)
1.1 Exploring the Jokes API (9:39)
1.2 API Testing Playground (3:43)
1.3 Creating the Models (6:07)
1.4 API Service (6:57)
1.5 Testing and Validating the APIService (7:11)
2.0 Introduction (1:14)
2.1 In the beginning…. (5:13)
2.2 JokeManager (10:15)
2.3 Preparing for the JokeView (5:01)
2.4 The JokeView (8:12)
2.5 JokeContentView (10:21)
2.6 Sharing a Joke with ShareLink (3:26)
2.7 Reporting Offensive Jokes (5:45)
2.8 Mac App to MenuBar App (5:45)
2.9 App Icons and App Distribution (7:11)
⬇️📦 2_MenubarApp_Resources.zip
3.0 Introduction (1:47)
3.1 The iOS Target (8:25)
3.2 Sharing Code between Targets (5:56)
3.3 Translation Service and Available Languages (5:05)
3.4 TranslationView (8:48)
3.5 Testing Translation on iPhone (4:56)
3.6 Joke Info Endpoint (5:13)
3.7 Updating APIService and Playground (10:23)
3.8 Info Tab (6:56)
3.9 BarChartView (6:35)
3.10 Fixing Multiple Joke Fetches (5:27)
4.0 Introduction (2:07)
4.1 Widget Extension (7:35)
4.2 JokeEntry and TimelineProvider (4:17)
4.3 WidgetJokeView (5:26)
4.4 Fetching Jokes for the Timeline (5:32)
4.5 Configurable Widget Template (9:32)
4.6 Configuration Intents (7:34)
4.7 Updating ConfigurableWidget (8:10)
4.8 Fixing the Language Picker (4:31)
4.9 MeshGradient Widget Background (8:17)
4.10 Creating a Link from the Widget (7:27)
4.11 New Endpoint and JokeManager Function (6:37)
4.12 Getting the Joke from the URL (10:12)
4.13 Displaying the Joke after Routing (5:52)
⬇️📦 4_WidgetTarget_Videos-1.zip
⬇️📦 4_WidgetTarget_Videos-2.zip
⬇️📦 4_WidgetTarget_Resources.zip
5.0 Introduction (2:10)
5.1 watchOS App Target (7:11)
5.2 The Joke View (8:52)
5.3 Adding Pickers (4:55)
5.4 Launch Complications (10:05)
5.5 Refresh Button (2:00)
6.0 Introduction (1:59)
6.1 RemovedCategoriesSync Test App (5:33)
6.2 RemovedManager Class (9:15)
6.3 Implementing RemovedManager (4:04)
6.4 Presenting a RemovedCategoriesListView (8:20)
6.5 Updating RemovedCategoriesListView (9:17)
6.6 Updating Smile4Me App (9:33)
6.7 Updating the getJoke Function (6:38)
6.8 Limiting Widget Choices (12:06)
6.9 Limiting Watch Choices, Part 1 (7:50)
6.10 Limiting Watch Choices, Part 2 (10:29)
⬇️📦 6_SynchingCategoryChoices_Videos-1.zip
⬇️📦 6_SynchingCategoryChoices_Videos-2.zip
⬇️📦 6_SynchingCategoryChoices_Resources.zip
If you want to support my work, you can -