└── README.md /README.md: -------------------------------------------------------------------------------- 1 | Are you struggling to find a project to make progress in your iOS career? Here is the document that tells you project ideas from the beginning to the advanced tier. 2 | 3 | Please focus on and learn the keywords deeply in the project descriptions! 4 | 5 | If you indent to get the best result, follow the projects by order. Do not jump from the first project to the fifth one. 6 | 7 | # Projects 8 | - [Calculator](#calculator) 9 | - [To-Do List](#to-do-list) 10 | - [Movies](#movies) 11 | - [News](#news) 12 | 13 | ## Calculator 14 | Build a simple single-page calculator. 15 | It should have numbers from 0 to 9, plus, minus, divide, and multiply buttons with their actions. 16 | Also, a label to show the result of the process. 17 | 18 | #### Goals 19 | - Get familiar with communication between the controller and its view 20 | - Align UI components regularly 21 | - Understand the logic mechanism in the controller 22 | - Make a meaningful, tidy folder structure 23 | 24 | #### Architecture 25 | Use the pure MVC which is the simplest architecture in iOS development. No need for a view model. 26 | 27 | #### Language / Framework 28 | Swift with UIKit. No need to use SwiftUI for now. 29 | 30 | #### Responsive Design 31 | - Use only one storyboard. Make all design processes in a single storyboard. No need to create separated storyboards or xib files 32 | - Fill the buttons on the screen by using horizontal and vertical stack views 33 | - Use constraints to make a dynamic sized stack view 34 | - You are free to align the buttons as you wish. 35 | 36 | #### Logic 37 | Insert outlets and actions of the buttons to the controller. Make the calculation by the operator. Use functions to make different calculations. 38 | 39 | #### Keywords 40 | - MVC 41 | - Storyboard 42 | - Auto Layout 43 | - StackView 44 | 45 | ## To-Do List 46 | Build a three-paged to-do list app that is similar to Apple's native Reminder app. 47 | It will have two screens. The first one is the list screen includes to-dos with their description, date, and time. Each to-do has a check button to make it completed. 48 | By tapping the plus(create) button, the create to-do screen opens. Users can define a description, date, and time on the to-do. A create button provides saving the to-do and it will be seen in the list on the list screen. 49 | In case the user taps on one of the to-dos, the detail page shows, and the user can edit the to-do. 50 | 51 | #### Goals 52 | - Understand MVVM by separating logic between controller and view model 53 | - Learn to implement table view 54 | - Integrate third-party library 55 | - Build UI programmatically in controller 56 | - Use model(such as ToDo) with Codable 57 | - Use UserDefaults to fetch and save data locally 58 | 59 | #### Architecture 60 | Use simple MVVM. No need to use protocols for now. Do not forget that **you must not import UIKit in the view model**. 61 | 62 | #### Language / Framework 63 | Swift with UIKit 64 | 65 | #### Responsive Design 66 | - Integrate [SnapKit](https://github.com/SnapKit/SnapKit) via **SPM** and build UI programmatically. No need to use any Storyboard od xib files 67 | - Use table view in the list screen 68 | - You are free to build UI as you wish 69 | 70 | #### Logic 71 | Implement Codable to your To-Do model and store to-dos as an array in local by using UserDefaults. 72 | 73 | #### Keywords 74 | - MVVM 75 | - Table view 76 | - Codable 77 | - SPM 78 | - SnapKit 79 | - UserDefaults 80 | 81 | #### Tips 82 | - Use **viewWillAppear** or **viewDidAppear** in the list screen to refresh the data 83 | 84 | ## Movies 85 | Build a four-paged movie list app. 86 | It will have four screens. The first appearing screen is the splash screen. The data must be fetched from the [API](https://developers.themoviedb.org/3/getting-started/introduction) in here. As soon as the process is done, endirect the user to the app. 87 | The first screen inside the app is the list screen that has list of movies with supporting search and filter. I can able to search by the name of the movie and filter by the category(the genres property in the movie object) of the movie. Each cell must at least have an image, title, and image of the movie. 88 | By tapping one of the movies, the movie detail screen must appear. I can able to add the movie into the bookmarks via a button. 89 | The last screen is the bookmarks which have the bookmarked movies. No need filter and search here, only a list. 90 | The list and bookmarks screens must be on a **TabBarController**. Tab bars' each first item must be **NavigationController**. 91 | 92 | #### Goals 93 | - Understand Tab Bar and Navigation Controller 94 | - Understand MVVM by separating logic between controller and view model 95 | - Learn to implement table view 96 | - Integrate third-party library 97 | - Build UI programmatically in controller 98 | - Use UserDefaults 99 | - Integrate network layer by URLSession 100 | - Use model(such as Movie) with Codable 101 | 102 | #### Architecture 103 | - Use simple MVVM. Do not forget that **you must not import UIKit in the view model** 104 | - Use protocols to pass the data from the network layer to the screen 105 | 106 | #### Language / Framework 107 | Swift with UIKit 108 | 109 | #### Responsive Design 110 | - Integrate SnapKit to build UI programmatically. No need to use any Storyboard od xib files 111 | - Use table view in the list screen 112 | - Download movie images via [Kingfisher](https://github.com/onevcat/Kingfisher) 113 | 114 | #### Logic 115 | - The search and filter mechanism in the list screen must work without blocking UI 116 | - Implement Codable to your Movie model and store movies as an array in a singleton object 117 | - Store bookmarked movies in the UserDefaults as an array 118 | 119 | #### Keywords 120 | - MVVM 121 | - Table view 122 | - Codable 123 | - SPM 124 | - SnapKit 125 | - Kingfisher 126 | - Network layer 127 | - URLSession 128 | - Singleton 129 | - UserDefaults 130 | 131 | #### Note 132 | This is one of the most essential projects since most of the companies ask this kind of case/challenge to understand your technical knowledge. Be more serious on this project than others! 133 | 134 | ## News 135 | Build a four-paged news list app. 136 | It will have four screens. The first appearing screen is the splash screen. Ask push notification permission at splash. 137 | The second screen is the list that includes the news from now to the past. Fetch the data from [Google News API](https://newsapi.org/s/google-news-api). I can able to refresh the data by the pull to refresh. 138 | The list screen must have a search and filter which can work at the same time. I can able to search by text and filter by date range such as from 01/01/2022 to 30/01/2022. **The search must work with the API, not locale**. 139 | By tapping one of the news, the news detail screen must appear. I can able to add the news to the favorites via a button. 140 | The last screen is the favorites that have the favorite news. No need filter and search here, only a list. Store the favorites with their news title and source URL. Open Safari when a favorited news is tapped. 141 | Use TabBarController to store the list and favorites screens. 142 | 143 | #### Goals 144 | - Learn asking permission 145 | - Learn how to use closures 146 | - Understand MVVM by separating logic between controller and view model 147 | - Integrate third-party library 148 | - Build UI programmatically in controller 149 | - Use UserDefaults 150 | - Integrate generic network layer by Alamofire 151 | - Use model(such as News) with Codable 152 | - Understand localization 153 | - Write unit test 154 | 155 | #### Architecture 156 | - Use simple MVVM. Do not forget that **you must not import UIKit in the view model** 157 | - Use closures to communicate between controller and view model 158 | - Build a generic network layer combined with Alamofire. Here is an [article](https://demirciy.medium.com/generic-network-layer-in-ios-development-2bffff780832) about it 159 | - Use protocols to pass the data from the network layer to the screen 160 | 161 | #### Language / Framework 162 | Swift with UIKit 163 | 164 | #### Responsive Design 165 | - Integrate SnapKit to build UI programmatically. No need to use any Storyboard od xib files 166 | - Use table view in the list screen 167 | - Download news images via [Kingfisher](https://github.com/onevcat/Kingfisher) 168 | 169 | #### Logic 170 | - The push notification permission must be async in the splash screen. The screen waits for the user's response to show the next screen 171 | - The search and filter mechanism in the list screen must work without blocking UI 172 | - Store favorited news in the UserDefaults as an array 173 | - Localize texts in at least two languages 174 | - At least the view models and network layer must be covered by the unit test 175 | 176 | #### Keywords 177 | - MVVM 178 | - Table view 179 | - Codable 180 | - SPM 181 | - SnapKit 182 | - Kingfisher 183 | - Generic network layer 184 | - Alamofire 185 | - UserDefaults 186 | - Localization 187 | - Unit test 188 | - Closure 189 | 190 | #### Note 191 | This is one of the most essential projects since most of the companies ask this kind of case/challenge to understand your technical knowledge. Be more serious on this project than others! 192 | --------------------------------------------------------------------------------