Swift Roadmap (includes explanations, examples, visual examples and resources) - iOS Development
Tags: programming, tutorial, swift, ios
Published: 2023-11-10 09:41:05


Hello, dev community! The past few weeks I've been hard at work on a Swift + SwiftUI Roadmap intended for those of you who want to learn about iOS Development, and in here you'll find all the knowledge for becoming a great iOS developer! Think of this as some kind of guidebook, but that actually wants to teach you something. Honestly this is something I wish I had when first starting to learn Swift.

**Why bother?**

Well, one of the key aspects of learning anything in this life is sharing knowledge with others. That's how the foundation of everything started, so I thought to myself that creating something like this would be amazing to pass down to the newcomers. Although this roadmap starts from a "level 0", there are a lot of more advanced concepts further down the line, so it can provide for everyone, even Swift developers that already have a lot of experience.

**Here is the visual format of the [roadmap](https://navigolearn.com/roadmap/swift-|-ios-development-40). It has the complete documentation, explanations given in full, examples, visual examples, funny jokes and even intermissions. I strongly suggest you check it out!**

# DO KEEP IN MIND THAT THIS IS ONLY A PREVIEW, THE FULL ROADMAP WITH ALL OF THE EXPLANATIONS, RESOURCES, AND PROJECTS IS AVAILABLE IN THE VISUAL FORMAT

**If you wish to contribute**

I know this may not be ALL the mountain that is Swift, but I tried to cover most of the important stuff. If you think I may have missed something very important, please do let me know. I really want EVERYONE to provide feedback and contribute to this roadmap, because as I said before: sharing knowledge is *key*, and I wish you would share yours to help others too!
Please consider creating an issue on our [GitHub](https://github.com/NavigoLearn/RoadmapsMarkdown/blob/master/programmingLanguages/swift/Swift%20Chapters.md) if you have any kind of problem with the roadmap or you would like to see it updated with other stuff.
Join our [Discord](https://discord.gg/xWZSHSKYAn) if you wish to provide relevant feedback for the roadmap and interact with our team.

# PLEASE GIVE FEEDBACK TO THE FULL ROADMAP IN THE LINK, AS I SAID THIS IS JUST A PREVIEW OF CHAPTERS AND RESOURCES, NOT THE FULL ROADMAP

**0.About Swift**

Swift is a modern and versatile programming language developed by Apple as a means for developers to write fast, responsive code for building AppleOS applications (includes iOS, tvOS, WatchOS, and even the new VisionOS)

- Easy to learn
- Performant
- Open Source
- Rich Library
- Growing Job Opportunities

**1. Swift Fundamentals**
- **Comments**
	- [Swift Documentation for Comments](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/#Comments)
	- [How to better Document Swift Code](https://www.youtube.com/watch?v=2DODdEhsrWA&ab_channel=EmmanuelOkwara)
- **Types in Swift**
	-  Constants and Variables
		-  [How to use Variables and Constants](https://www.youtube.com/watch?v=jRNa6hYTJLo&list=PLwvDm4VfkdpiLvzZFJI6rVIBtdolrJBVB&index=4&ab_channel=SwiftfulThinking)
		- [The Basics - Constants and Variables](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics#Declaring-Constants-and-Variables)
	- Basic Types (bool, integer, string)
		- [Integers](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics#Integers)
		- [Floating-Point Numbers](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics#Floating-Point-Numbers)
		- [Strings and Chars](https://www.youtube.com/watch?v=NbkPGvalyUU&ab_channel=DarrellRoot)
		- [Booleans](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics#Booleans)
		- [Tuples](https://www.youtube.com/watch?v=zsjCrtENsZA&ab_channel=SwiftfulThinking)
		- [Optionals !!!!](https://youtu.be/PDWNf4pBI64?si=Jy_ViWkKgt_BlXlG)
	- Type Safety and Inheritance
		-  Swift is a Type-safe language, meaning you must keep track of a variable's type
		- [Type Safety and Type Inheritance](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics#Type-Safety-and-Type-Inference)
	- Functions - very important!! And probably the core of Swift
		- [How to use Functions in Swift](https://youtu.be/kr3SSplrJlw?si=AZ_Vq4DBUsum3-JR)
- **Non-Primitive Data Types in Swift**
	- ObjectOrientedProgramming is based on the premise that we design code around data and objects instead of functions and logic.
		- [What is Object Oriented Programming](https://youtu.be/XdZUVmqIkJE?si=0_ZoGvBmRxBVY2Wm)
	- Enums in Swift
		- [How to use Enums](https://www.youtube.com/watch?v=YPUCML__Md8&list=PLwvDm4VfkdpiLvzZFJI6rVIBtdolrJBVB&index=11)
	- Structs in Swift
		- [How to use Structs](https://youtu.be/gRKlprUj-I8?si=zCqPpPLISMYeMes3
	- Classes in Swift
		- Classes are used to define objects, and they are very alike to Structs, but Classes are used to defined much more complex Objects
		- [Classes in Swift](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures)
		- [How to use Classes in Swift](https://youtu.be/xJgtknc-7CA?si=o1KVXWn6lXWqzHNN)
	- Access Control
		- Literally what the name suggests, it ensures a way to control which files are accessible from what part of your project.
		- [How to use Access Control](https://youtu.be/UbX2UtgZTJI?si=1i9o1J1w_l5VJU3a)
	- Arrays
		- This is a Collection Type
		- [Learn all about Swift Arrays](https://www.tutorialspoint.com/swift/swift_arrays.htm)
	- Sets
		- This is a Collection Type
		- [Sets in 60 seconds](https://www.youtube.com/watch?v=iotojg2MgGQ)
	- Dictionaries
		- This is a Collection Type
		- [How to use Dictionaries in Swift](https://youtu.be/ctBEqA0wh3M?si=En_hX_LczWCAaZM3)
- **Flow Control in Swift (Loops and Conditionals)**
	- If-Else Conditionals (every programming language 101)
		- [Conditionals for Beginners](https://www.youtube.com/watch?v=9Snw7polcBU)
	- For, While, Repeat - the three horseman
		- [Swift for Beginners - Loops](https://www.youtube.com/watch?v=9Snw7polcBU)
	- Guard Statements - kind of a reverse of an if statement
		- [Swift for Beginners - Guard Statements](https://www.youtube.com/watch?v=DTd7HHSAw-4)
	- Defer statement - used for code cleanup after exit
		- [All you need to know about defer](https://www.linkedin.com/pulse/power-defer-swift-ramdhas-m#:~:text=In%20Swift%2C%20the%20%22defer%22,before%20the%20scope%20is%20left.)
- **Collection Types Operations (Sort, Filter, Map)**
	- [How to Filter an Array in Swift](https://www.logilax.com/swift-filter-array/)
	- [How to use Sort in Swift](https://www.geeksforgeeks.org/sorting-an-array-in-swift/#:~:text=To%20sort%20the%20array%20we,the%20array%20in%20ascending%20order.)
	- [How to Map in Swift](https://cocoacasts.com/swift-essentials-1-how-to-use-swift-map-to-transforms-arrays-sets-and-dictionaries)
	- [How to Filter, Sort, and Map in Swift](https://youtu.be/NkOU60vwUEY?si=67RJ-Lkc-5Zzk3lY)

**2. Creating and Manipulating Views**
- In SwiftUI you can add text, images, buttons, custom shapes, and pretty much any UI element you could ever think for, but what you have to understand is that any element has to be inside of a `View` protocol [What are View Protocols](https://developer.apple.com/documentation/swiftui/view)
	- Basic UI Elements
		- [How to use Text in SwiftUI](https://youtu.be/RKfkG01x79w?si=tGOAAQCWPPKa2rrl)
		- [Adding Padding to Text in SwiftUI](https://www.swiftbysundell.com/articles/backgrounds-and-overlays-in-swiftui/)
		- [How to use Shapes in SwiftUI](https://youtu.be/1dWHjdWgS5M?si=qILsnnBylwcyz4mZ)
	- Graphics Manipulation - Colors
		- [Basic knowledge of Color usage in Swift](https://developer.apple.com/documentation/swiftui/color)
	- Gradients
		- [How to render a Gradient ](https://www.hackingwithswift.com/quick-start/swiftui/how-to-render-a-gradient)
	- Manipulating Images
		- [Mastering SwiftUI Image View](https://www.swiftyplace.com/blog/mastering-swiftui-image-view)
	- Frames
		- [How to use Frames and Alignments in SwiftUI](https://youtu.be/BN8IEiM_3qI?si=zSiw3EZDiOn73uJj)
	- Stacks - VStack, HStack, ZStack
		- [How to use Stacks in SwiftUI](https://youtu.be/pv-vbUEzimk?si=NIN-OYq0OnSRpPXX)
	- Backgrounds
		- [How to use System Materials and Backgrounds in SwiftUI](https://youtu.be/_PJstGf5XcE?si=HJ9btpT2-9HBg-oz)
	- Spacers
		- [How to use Spacer in SwiftUI](https://youtu.be/cL23Wx-zbJU?si=XzT1K1td8dSqBUQ2)
	- ScrollView - container of elements using Lazy Stacks
		- [ScrollView containers](https://developer.apple.com/documentation/swiftui/scrollview)
		- [Using LazyStacks in SwiftUI](https://youtu.be/vHvb7LH8VuE?si=f0zGz8UXmJjS9-35)
	- ScrollViewReader
		- [Implementing ScrollViewReader in SwiftUI](https://youtu.be/DbvcD2pQGmE?si=SMannIKKPwSqYxK0)
	- Safe Areas - defining and ignoring them
		- [How to use and ignore the Safe Area in SwiftUI](https://youtu.be/_0NDKxvfg40?si=pp9dP_xTbo1z1Gsv)

**3.State Management**
- State management in Swift happens by just declaring variables instead of constants (e.g., `var welcomeText: String = "Hello, user!"`), but, SwiftUI doesn't like this because it doesn't know that the variable will at some point change, and since we are working with UI elements, the View protocol should update according to the value of the variable. That's where the state property wrapper comes into play.
	- [How to use the State property wrapper in SwiftUI](https://youtu.be/LgJ9r_VWdSI?si=SctZzRX__Yf4TfCE)

**4.Sharing View States**
- [Observable objects, environment objects, and @Published](https://www.youtube.com/watch?v=lxaEAHNmhY4&t=150s)
- [How to use Observable Objects in SwiftUI](https://youtu.be/-yjKAb0Pj60?si=qbFq9bVqpqhQ-2z4)

**5.Sharing State between Parent and Child - Binding**
- [How to use @Binding in SwiftUI](https://youtu.be/btDMzB5x2Gs?si=tfTicZ9PoMWsPlSF)

**6.Extracting functions and Subviews**
- [How to extract functions in SwiftUI](https://youtu.be/pIUBC6wZjpM?si=HZHBQE6YoWdJW06e)
- [How to extract subviews in SwiftUI](https://youtu.be/h1QdmK5fSIg?si=motq4VGIm6dyMGGU)

**7.Gestures and Animations; Transitions**
- [How to use gestures in SwiftUI](https://youtu.be/kQhBS2qUKXc?si=PAX_Ycr3GV6fL-Ud)
- [Adding Animations in SwiftUI](https://youtu.be/0WY-wrW2_bs?si=ShnaoNF_XeRQVWyU)
- [Animation Curves and Timing in SwiftUI](https://youtu.be/0H4G3lGnJE0?si=xr09xupz0oU6gp7W)
- [Showing and Hiding views with Transition](https://www.youtube.com/watch?v=jySfyxQGMFg)

**8.Swift Sheets**
- Now that we know how to add and customize animations and transition to our app, another *KEY* element that developers use when building applications are what's known as Sheets
	- [How to present a new view using Sheets](https://www.hackingwithswift.com/quick-start/swiftui/how-to-present-a-new-view-using-sheets)

**9.ActionSheet and Alerts**
- [How to show an alert](https://www.hackingwithswift.com/quick-start/swiftui/how-to-show-an-alert)
- [How to show an Action Sheet](https://www.hackingwithswift.com/quick-start/swiftui/how-to-show-an-action-sheet)

**10. Context Menu**
- [How to show a context menu](https://www.hackingwithswift.com/quick-start/swiftui/how-to-show-a-context-menu)

**11. NavigationStack**
- So, you've already learned about transition animations and adding sheets (a view on top of an existing view), but, let's say that for example you want to change the keyboard language on your iPhone. For that, you'd have to go to Settings -> General -> Keyboard -> Keyboards. And, as you can tell, the system isn't adding sheets on top of sheets on top of the main view, because that would be horrible, like? Well, here's where NavigationStacks come into play (previously known as NavigationView, but that's became deprecated in iOS 17) and NavigationLinks
	- [How to use NavigationStack in SwiftUI](https://youtu.be/oxp8Qqwr4AY?si=delrQ4toWFMtJVRQ)

**12. Lists**
- Since we've learned about creating the flow of navigation of our app using NavigationStack, now's a good time to tell you about `Lists`. Lists and navigation go hand-in-hand because it's very easy to define links using lists.
	-  [How to use List in SwiftUI](https://youtu.be/tkOnXG-sNks?si=8b7ZVuS72yUOtC85)

**13. TabView and Badges in SwiftUI**
- TabView
	- [How to use TabView in SwiftUI](https://youtu.be/5E_D9D8Z5nQ?si=NQa59ssKcoHKCBZw)
- Badges, .badge modifier
	- [How to use Badges in SwiftUI](https://youtu.be/Nt1loGvkQkM?si=kyyf8NF3-5tdL2z-)

**14. User Inputs - Text Inputs, Toggles, TextSelection**
- Other UI Elements that will most likely be present in your application are [TextField](https://developer.apple.com/documentation/swiftui/textfield) and [TextEditor](https://developer.apple.com/documentation/swiftui/texteditor). Text fields are text inputs that you request from users of your app. These can be anything you want, but they are mostly used for requesting user data (things like passwords, emails, usernames) and stuff like that. There are also Toggles, simple control switches that "toggle" between an on and off state
	- [Text Inputs in SwiftUI](https://youtu.be/w_U2tgKQT5Y?si=6vWbkIyShEqeWESR)
	- [How to use a Toggle in SwiftUI](https://youtu.be/JIT8sL_VtNA?si=QfAXQKaLFC4wIr7X)
	- [How to use textSelection in SwiftUI](https://youtu.be/AiSLtya25ac?si=Kixy3LYAOFEP4Cuj)


**15.FocusState**
- [How to use @FocusState in SwiftUI](https://youtu.be/9OC8e0OULBg?si=Wggss-chvwBsbdfE)

**16. Pickers - Color, Date & Menus**
- [How to use Picker and PickerStyles in SwiftUI](https://youtu.be/2pSDE56u2F0?si=gEq_GwIPldnEvLrJ)
- [How to use ColorPicker in SwiftUI](https://youtu.be/nUlY2RYHV9U?si=s8y6iaQxUFaet9x7)
- [How to use DatePicker in SwiftUI](https://youtu.be/EnNAQ-b1yPU?si=hZ70F9nm5UPwIhvk)
- [How to use Menus and MenuStyles in SwiftUI](https://youtu.be/4ow8bRY2McE?si=_-w-RdDSip_rEHfL)

**17.Other User Inputs - Steppers and Sliders**
- [How to use a Stepper in SwiftUI](https://youtu.be/T7inPesyOY8?si=-FNyWpTxlTeDxCcn)
- [How to use a Slider in SwiftUI](https://youtu.be/HwqxgiKQ_E4?si=ngkjJcSsV7KyUVf-)

**18. Complex view methods**
- Now, let's talk about Complex View methods starting with `.onAppear()` and `.onDisappear` functions. As their name suggests, the functions add an action to perform before the view appears, or after the view appears.
	- [How to use onAppear and onDisappear in SwiftUI](https://youtu.be/QAP4DbfoKvk?si=q3Rupzw4Cr-yoiyy)

**19. Custom Models in Swift**
- [How to use custom models in SwiftUI](https://youtu.be/bQQlnGaYN14?si=61xs6rpfgI7d7jVn)

**20.AppStorage**
- Now, in iOS applications, you want to sometimes store data inside of the application cache, using the `@AppStorage` property wrapper. [AppStorage](https://developer.apple.com/documentation/swiftui/appstorage) is useful for restoring the state of the application when a user closes it, and is generally used to reflect User Defaults values, useful for storing, for example, if a user is signed in or signed out of your app. 
	- [How to use @AppStorage in SwiftUI](https://youtu.be/zyuSUrfelw8?si=ti6Q8tgmeIuLYMRn)

**21. Transitioning to Concurrency - AsyncImage**
- Another *KEY* element in building Swift Applications is the [AsyncImage](https://developer.apple.com/documentation/swiftui/asyncimage) view. What it basically does is it waits for the image to load before actually displaying it on the screen. You will find out more about Swift Asynchronous methods when we will talk about all aspects of Swift Concurrency, but for now, let's finish with the first part of the SwiftUI stuff. 
	- [How to use AsyncImage in SwiftUI](https://youtu.be/Qk5s-6ldNfA?si=RtqN43uW8sB2zGyC)

**22.Toolbar**
- [How to use Toolbar in SwiftUI](https://youtu.be/53fWEfSo0tk?si=h35tnZIAQ7dr6thO)

**23.Adapting your code to Dark Mode**
- The pinnacle of app design - [Dark Mode](https://developer.apple.com/documentation/uikit/appearance_customization/supporting_dark_mode_in_your_interface). Since we are all aspiring young developers, most of us zoomers even, we just can't stand to stare at white elements on our 1000nits HDR10+ 4K OLED monitors, because they burn right through our fragile retinae. So, what you will have to do at some point is make your App dark mode compatible. How you do that, you might ask? Well, to put it simply, you define colors that dynamically change if the user has its appearance set to Light or Dark.
	- [How to adapt for Dark Mode in SwiftUI](https://youtu.be/DB5uNhIea-o?si=6hdWdB4LG_Adtwuk)

**24.Documenting your Swift Code**
- Imagine that there wouldn't exist documentation at all. It's just like IKEA sending you a floating bed with drawers but without giving you any instructions at all on how to assemble it. Even with the instructions, they are hard to do and take countless hours, but think about the horror that would await you without instructions at all!
	- [How to add documentation to Swift in Xcode](https://www.youtube.com/watch?si=6Jy3WRhFj18nAH6q&v=O8_meC7hIwI&feature=youtu.be)


**---Swift Concurrency ---**

**25.What is Concurrency?**
- Think of Concurrency as Swift’s fancy way of naming Asynchronous operations. Concurrency is Swift’s built-in way of writing the this type of operations. But what does [Asynchronous](https://www.indeed.com/career-advice/career-development/asynchronous-programming) actually means? Well, it refers to the fact that a piece of code actually runs in parallel to the main program flow. That's why it's called concurrency in Swift, because actions take place concurrently with program execution, without the app needing to wait for the results. In short, it is code that can run independently without requiring to wait for some part of it to be run. Think of videogame loading screen, and what happens when you go to a new level. The game has to load the assets required for your level, for your character, calculate the vector graphics, get your stats, your HP, etc. Well, imagine how long it would take if the game wasn't allowed to load all of this stuff in parallel, and instead it would first load the assets, then start building the environment and place each of the asset independently to where they belong, then render the graphics and so on. So what this actually does is it allows the user to go about his business in your application, while your app loads other stuff in the background that may or may not be required for future user actions.
Now, let's go back to Swift and talk about [Concurrency](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/#). 

**26.Error Handling**
- [How to use Do, Try, Catch and Throws in Swift](https://youtu.be/9fXI6o39jLQ?si=aAkI4ppLYPvves_n)

**27.Async and Await Functions**
- [How to use Async/Await in Swift](https://youtu.be/9fXI6o39jLQ?si=l5iyperCiJX2fnxS)
- [How to use Async Let in Swift](https://youtu.be/1OmJJwVF7uQ?si=xZlyv2FK3EHWktGp)

**28. Task**
- Basically, just like in an employee schedule, some tasks will have a higher or a lower priority than others. For example, getting coffee for your cute co-worker Sarah should be of lower priority than fixing a bug that corrupts the entire database everytime a user likes Sarah's post (well, it depends, but you get the idea).
- [How to use Task and .task in Swift](https://youtu.be/fTtaEYo14jI?si=1XjBCk0yG87PfOBu)
- TaskGroup
	- [How to use TaskGroup in Swift](https://youtu.be/epBbbysk5cU?si=v1mFHexHy5mn_tcA)

**29.Actors**
- [Swift: Struct vs Class vs Actor, Value as Reference Types, Stack vs Heap](https://youtu.be/-JLenSTKEcA?si=WCtDkm-gbt6I3Tou)
- [How to use Actors in Swift](https://youtu.be/5LKbL-I-CYY?si=e8NBniS8r0Dgj6IE)
- Global Actors
	- [How to use Global Actors in Swift](https://youtu.be/BRBhMrJj5f4?si=Jjp49-LD3JMVG1bc)

**30.The Sendable Protocol**
- [How to use the Sendable protocol in Swift](https://youtu.be/wSmTbtOwgbE?si=TkcB_VD5SwSgAVzF)

**31.MVVM Design Pattern**
- [MVVM](https://adevait.com/ios/swift-tutorial-mvvm-design-pattern#) stands for Model-View-ViewModel. What it does is it describes the flow of data within our app and separates application tasks(handling of the UI, the backend such that the view is not dependent on any specific model problem).
	- Model - responsible for representing the data from our backend logic
	- View - responsible for handling all the layouts and displaying the data
	- ViewModel - responsible for transforming data recieved in a View, recieving actions from the View, dealing with logic
- [MVVM Swift: Model View ViewModel Design Pattern](https://youtu.be/qzXJckVxE4w?si=w2_sskYXJW5PN8s0)

**32.Search Features**
- All you need to do to add a search interface to your app is applying one of the searchable view modifiers inside of your NavigationStack or a view inside of it, by using `.searchable()`
	- [How to use Searchable, Search Suggestions, Search Scopes in SwiftUI](https://youtu.be/f2nxenwKCVM?si=uh8ehgg8CoTO0VAw)

**33.PhotosPicker**
- A Picker that we haven't talked about yet is the new PhotosPicker introduced in the PhotoUI framework in Swift.
	- [How to use PhotosPicker in SwiftUI](https://youtu.be/IZEYVX4vTOA?si=5w5TF_H_bANc0ZpW)

**Alright, let's finish business: SwiftUI Part 2**

**34.Timer and .onReceive**
- [Timers](https://developer.apple.com/documentation/foundation/timer) and just as the name says, a class object that, we say, "fires" after a certain time interval. To actually use the data sent by Timers, we use the `.onReceive()` modifier, which can be read about [here](https://developer.apple.com/documentation/swiftui/view/onreceive(_:perform:)).
	-  [How to use Timer and .onReceive in SwiftUI](https://youtu.be/ymXRX6ZB-J0?si=EtvNW_kMsv9mNKyf)

**35.FileManager in Swift**
- This is another *KEY* element that you have to learn for mastering Swift
	- [How to save data and images to FileManager Swift](https://youtu.be/Yiq-hdhLzVM?si=B8CTqzpQYZLylf_z)

**36.Haptics and Sound Effects**
- New in iOS 17, Apple introduced the [SensoryFeedback](https://developer.apple.com/documentation/swiftui/sensoryfeedback) view modifier, marked by `.sensoryFeedback()` which can now represent simple haptics useful for example to let the user know that a task has succeeded or if an error is present.
- Simple sound effects can also be easily added inside of our application using the [AVFoundation](https://developer.apple.com/documentation/avfoundation/) framework built by Apple. You can simply import it into your app and use something like `AudioServicesPlaySystemSound(1026)`, where 1026 is the SystemSound id, for simple alerts and or notification sounds within your app. If you want to add custom sounds, you should instead use [AVKit](https://developer.apple.com/documentation/avkit) Framework. 
	- [How to add haptic effects using sensory feedback](https://www.hackingwithswift.com/quick-start/swiftui/how-to-add-haptic-effects-using-sensory-feedback)
	- [How to add sound effects in Swift](https://youtu.be/iBLZ1C4L5Mw?si=lxa67subPxbDW3LE)

**37.Push Notifications**
- [How to use local Push Notifications in SwiftUI](https://youtu.be/mG9BVAs8AIo?si=HiM9YMutuqxzUSgE)

**38.Core Data - CRUD Operations**
- This is another way to cache application data, just like UserDefault, BUT, this is used to add a LOT of data inside of it, unlike UserDefault which should be used only for very small pieces. We will also talk about CRUD operations (Create, Read, Update, Delete)
	- [How to use Core Data with @FetchRequest in Swift](https://youtu.be/nalfX8yP0wc?si=5v06hAKd7AdVeTox)
	- [How to use Core Data with MVVM in Swift](https://youtu.be/BPQkpxtgalY?si=yI-e81-JELFJPDPE)
- One thing that you need to know is that every App that uses Core Data has a [Core Data stack](https://developer.apple.com/documentation/coredata/core_data_stack).
	- [What is the Core Data Stack](https://www.youtube.com/watch?v=KA3mR5JI4H4)

**39.Multi-threading in Swift**
- [Multi-threading with background threads and queues in Swift](https://youtu.be/jEpg2SYvVV8?si=hTg5Qwwr1JWsSycr)

**40.Closures**
- [How to use Escaping Closures in Swift](https://youtu.be/7gg8iBH2fg4?si=jWS37B8IeJKQEra9)
- [@escaping explained in Swift](https://youtu.be/xiS5gJOIQxI?si=kXNf5cS5Demqt113)

**41.Codeable, Encodable, Decodable**
- [Codable, Decodable and Encodable in Swift](https://youtu.be/H9mt8WjpZgM?si=gqgJ4_o-tN62tgJb)

**42.Using the API in Swift**
- In this roadmap, we'll talk about two ways which you can download data in Swift
	- The first one is by using [URLSession](https://developer.apple.com/documentation/foundation/urlsession), which is a class object that coordinates a group of related, network data transfer tasks. 
	- The second one is by using the [Combine](https://developer.apple.com/documentation/combine) Framework. This framework provides a Swift API that processes values over time, which can represent many kinds of asynchronous events, by using what's known as [Publishers](https://developer.apple.com/documentation/combine/publisher) and [Subscribers](https://developer.apple.com/documentation/combine/subscriber). Publishers provide data which can then be accesed by Subscribers

**43.NSCache**
- Another type of caching class object in Swift is [NSCache](https://developer.apple.com/documentation/foundation/nscache).  But, the key thing with this type ofcaching is that it is not permanent, will not persist between sessions, and it's used to store key-value pairs that may be deleted in case of low resources on the user's phone.
	- [How to save and cache images in a SwiftUI app](https://youtu.be/yXSC6jTkLP4?si=_bTVuMKex7Q3_JZ-)

**44.Custom features in SwiftUI**
- [Custom ViewModifiers in SwiftUI](https://youtu.be/MQl4DlDf_5k?si=CjmTUXJqR7hmr-R7)
- [Custom ButtonStyle in SwiftUI](https://youtu.be/uK1wKIY49z0?si=pQ0Wrd4bUH1otPbp)
- [Custom Transitions in SwiftUI](https://youtu.be/lF6g07FDsM0?si=Pq5kxAZ9HUKUf6HW)
- [How to use MatchedGeometryEffect in SwiftUI](https://youtu.be/Jyh65AMRqzQ?si=8m4dqkdUxq_dOCuA)
- [Custom Shapes in SwiftUI](https://youtu.be/EHhgjOt_KFA?si=th-8NZnLh6y1dyn6)
- [Custom shape susing Arcs and Quad Curves in SwiftUI](https://youtu.be/UvQcNSjgydY?si=UshkHEEiVJfBoig5)
- [Custom Tab Bar in SwiftUI](https://youtu.be/FxW9Dxt896U?si=mrWvqXGYbwJq_yPM)
- [Custom Navigation Bar in SwiftUI](https://youtu.be/aIDT4uuMLHc?si=uE4h7Sg6yWm_8A8G)
- [Custom Bindings in SwiftUI](https://youtu.be/K91rKH_O8BY?si=afjFwsT_M7Jkh_5F)
- [Custom Errors and Alerts in SwiftUI](https://youtu.be/lncOFL3Qsns?si=e-vfX0kvepD5qvEn)
- [Custom Property Wrappers - part 1](https://youtu.be/2wzq6SQkSJE?si=AkDDDw7m5JMTMNHo)
- [Custom Property Wrappers - part 2](https://youtu.be/TERHgCD_tGA?si=x3_6SpaQrdnzuAgq)

**45.Custom Protocols in Swift**
- I've talked before about what Protocols are and I've actually referenced them a lot throughout this roadmap, but now we'll do a deeper dive inside this concept. First of all, a Protocol defines a blueprint of methods or properties thatcan then be adapted by classes (or other types). One of the biggest benefits of using `Protocols` is actually the fact that multiple classes can abide by a single protocol. Let's suppose we have two objects `struct Dog { var breed: Labrador}` and `struct Cat { var breed: British Shorthair}`. Now, let's print their names. You'd have to do something like `func printOut(dog: Dog){ dog.breed }` and `func printOut(cat: Cat){ cat.breed }`. But, if you'd use a protocol, for example `Protocol Printing { var name: String { get } }`, and then you define the structs as protocolsof `Printing`: `struct Dog: Printing { var name: String }` and `struct Cat: Printing { var name: String }`, you could then use a single function to print both of their names, like so: `func printOut(object: Printing) { print(object.name) }.
	- [How to use Protocols in Swift](https://youtu.be/0gM1wmW1Xvc?si=bGHXVvmuGFLk40vc)

**46.Unit and UI Testing**
- [Unit Testing in SwiftUI](https://youtu.be/eqdvIUKsM2A?si=JKEjJknnHHZfPt_V)
- [UI Testing in SwiftUI](https://youtu.be/RoDUYFuNeJU?si=Q_JnOuiRgktqn_ag)

**47.CloudKit**
- [CloudKit](https://developer.apple.com/documentation/cloudkit/) is Apple's Framework for moving data between your app and iCloud. With this, you make sure that data stored by your app in iCloud can be accessed from multiple devices (e.g., the Notes app on iPhone and Mac use CloudKit for keeping notes synced between them). This framework provides services from transfering data to and from iCloud servers, and network connection MUST be present for it to work (that's why it's a cloud, duh)
	- [Setup CloudKit in SwiftUI](https://youtu.be/tww2vbJjXpA?si=elAwKCYChyKz0vxO)
	- [CloudKit CRUD Functions](https://youtu.be/A-1U_iXiCyI?si=wSFBxaQBuaxGICWC)
	- [Upload Images and CKAssets to CloudKit](https://youtu.be/AtFMqG-zziA?si=o92wq_CKnpiCIrj8)
	- [Sending Push Notifications using CloudKit](https://youtu.be/vr5CBfaK14A?si=jCCywuByIXpfLicO)
	- (ADVANCED!)[Creating a reusable utility class for CloudKit](https://youtu.be/OD_FDJOv-Ek?si=xbVnEQ3LjV6MWnJJ)

**48.TimelineView**
- [TimelineView](https://developer.apple.com/documentation/swiftui/timelineview) is a view that updates according to a provided schedule, acting as a container where it redraws the content it contains at scheduled point of time. This is useful, for example, when we don't want the body of our SwiftUI views to update whenever a data change occurs, but at a given point in time.
	- [How to use TimelineView in SwiftUI](https://youtu.be/ZmXp6Pd5Elg?si=38Ttv5731egnBoMg)

**49.KeyPaths in Swift**
- [How to use KeyPaths in Swift](https://youtu.be/FmjG6mG-GIA?si=60ui3rKCgk7PpiUa) 

**50.Accessibility - VoiceOver**
- [How to use VoiceOver in Swift](https://youtu.be/bERGMFHe9uc?si=rBmpxYPFWW0yJZ0-)

**51.The End**
-  Damn, you've finally did it. You reached the end. Congratulations! Took way longer than you first hoped for, huh? Well, as you could already see, Swift is a very vast and complex programming language, but, the easy-to-find documentation and video tutorials provide you with a bunch of tools useful for learning, but, one thing to keep in mind is that with every new OS version, Apple adds a bunch of improvements to Swift and sometimes also removes or provides replacement for functions and methods in all of their Frameworks. Altough I've covered most of the stuff available currently in Swift, there's no telling when some things will get deprecated or better alternatives will be available. 
- What I'd do in your place is explore my horizon. There's no better alternative to learning than to practice and write Swift code yourself, and by building an app from the ground-up all by yourself. Me, personally, I tried to create a SoundCloud alternative with better UI and animations. It was a fun project that I enjoy, and I plan on releasing the repo for it on GitHub in the future after I finish it, because right now it's in a rougher shape :D


Please let me know what you think about it and make sure to join our Discord