awesome-ios-developer/README.md

438 lines
12 KiB
Markdown
Raw Normal View History

2021-04-10 16:21:15 +07:00
# Useful Swift Things
2021-04-10 15:42:23 +07:00
2021-04-10 16:27:15 +07:00
<div align="center">
2021-04-13 13:32:42 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/swift.jpeg">
2021-04-10 16:27:15 +07:00
</div>
2021-04-27 12:19:44 +07:00
<p>
</p>
2021-04-27 12:11:04 +07:00
<p align="center">
<img src="https://img.shields.io/badge/-OneDayOneCommit-critical?style=plastic&logo=swift" />
</p>
2021-04-13 13:33:49 +07:00
2021-04-10 16:15:30 +07:00
## Content
2021-04-10 04:14:59 +07:00
- [Coding convention](#Coding-convention)
2021-05-05 15:26:00 +07:00
- [Swift Lint](#Swift-lint)
2021-04-10 16:05:27 +07:00
- [Design Pattern](#Design-Pattern)
2021-04-11 02:05:11 +07:00
- [Delegate](#Delegate)
- [Singleton](#Singleton)
2021-04-27 11:39:49 +07:00
- [Observer](#Observer-Pattern)
2021-04-10 16:18:23 +07:00
- [Code Structuring](#Code-Structuring)
2021-04-10 16:20:15 +07:00
- [MVC](#MVC)
- [MVVM](#MVVM)
2021-04-27 11:39:33 +07:00
- [VIPER](#VIPER)
2021-04-10 04:19:52 +07:00
- [UIDesign](#UIDesign)
2021-04-22 17:06:56 +07:00
- [Helper](#Helper)
2021-05-03 14:35:24 +07:00
- [Email, Message, Call](#email-message-call)
2021-05-03 13:57:35 +07:00
- [Network Layer](#Network-Layer)
2021-05-03 16:50:11 +07:00
- [Image Picker](#Image-Picker)
2021-05-03 18:21:44 +07:00
- [File Manager](#File-Manager)
- [Video Downloader](#Video-Downloader)
2021-05-03 19:09:09 +07:00
- [Location Manager](#Location-Manager)
2021-04-10 04:19:52 +07:00
- [API](#API)
2021-04-10 15:55:09 +07:00
- [JSON](#JSON)
2021-04-10 04:30:48 +07:00
- [Third Party Library](#Third-Party-Library)
2021-04-29 11:42:01 +07:00
- [GCD](#GCD)
2021-04-30 13:40:48 +07:00
- [DispatchQueue](#DispatchQueue)
- [DispatchGroup](#DispatchGroup)
- [DispatchWorkItem](#DispatchWorkItem)
2021-04-30 17:16:16 +07:00
- [Thread Sanitizer](#Thread-Sanitizer)
2021-04-23 14:19:47 +07:00
- [Useful Stuff](#Useful-Stuff)
2021-04-23 23:34:04 +07:00
- [Show Preview in UIKit(Build UI with Code Base)](#show-preview-in-uikitbuild-ui-with-code-base-----)
2021-04-25 04:50:50 +07:00
- [Write README.md](#write-readmemd)
2021-04-10 03:16:44 +07:00
2021-04-10 03:25:46 +07:00
2021-04-10 04:13:06 +07:00
## Coding convention
2021-04-10 15:22:54 +07:00
set of guidelines for a specific programming language that recommend programming style
### Swift Style Guide
2021-04-10 04:12:26 +07:00
2021-04-10 14:51:46 +07:00
- [Swift Style Guide](https://github.com/linkedin/swift-style-guide)
2021-04-10 04:34:45 +07:00
### Swift Lint
2021-04-10 15:20:40 +07:00
The way of force you to adapt coding convention
>otherwise project build will **FAILED**
2021-04-10 15:14:13 +07:00
- [Swift Lint](https://github.com/realm/SwiftLint) apply for all project:+1:
2021-04-15 19:36:44 +07:00
```swift
2021-04-15 19:36:01 +07:00
if which swiftlint >/dev/null; then
swiftlint
else
echo "error: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
exit 1
fi
```
2021-04-10 04:34:45 +07:00
put .yml file into root folder and apply following code in Build Phases
2021-04-10 03:47:49 +07:00
2021-04-22 17:19:49 +07:00
**You can modify(delete) SwiftLint Option with opening .yml file**
2021-04-22 17:20:10 +07:00
2021-04-22 17:21:49 +07:00
> Shift + Command + . will show the hidden file
2021-04-22 17:19:49 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/swiftLintChange.png">
2021-04-10 16:11:11 +07:00
## Design Pattern
2021-04-14 04:00:57 +07:00
Design pattern is
2021-04-14 04:01:22 +07:00
2021-04-14 04:00:57 +07:00
Check [this](https://refactoring.guru/design-patterns/swift) website for design pattern in Swift
2021-04-10 16:11:11 +07:00
### Delegate Pattern
2021-04-10 16:30:44 +07:00
```swift
2021-04-10 16:11:11 +07:00
weak var delegate: SomeProtocol?
```
### Singleton Pattern
2021-04-10 16:30:44 +07:00
```swift
2021-04-10 16:11:11 +07:00
class SingletonPattern {
static let manager = SingletonPattern()
private init() {}
2021-04-10 16:11:45 +07:00
}
2021-04-10 16:11:11 +07:00
```
2021-04-14 04:02:14 +07:00
### Observer Pattern
2021-05-06 20:56:57 +07:00
The observer pattern lets one object observe changes on another object. Apple added language-level support for this pattern in Swift 5.1 with the addition of Publisher in the Combine framework.
2021-04-14 04:02:14 +07:00
2021-04-10 16:18:23 +07:00
## Code Structuring
2021-04-10 16:05:27 +07:00
2021-04-10 16:18:23 +07:00
### MVC
2021-04-10 16:05:27 +07:00
2021-04-15 10:00:46 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/MVCModel.png">
2021-04-13 13:33:49 +07:00
2021-04-10 16:20:15 +07:00
### MVVM
2021-04-15 10:01:10 +07:00
##### MVC vs MVVM
2021-04-15 10:00:46 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/MVVMvsMVC.png">
2021-04-19 15:39:24 +07:00
M -> Model Which holds the application data
V > View It displays the data that is stored in model. These are visual elements through which a user interacts. These are subclasses of UIView
VM > View Model Transform model information/data and it interacts with controller or view to display those informations.
C > Controller class It will be there but the responsibility of view business logic has been removed and give to view model
2021-04-27 11:39:33 +07:00
### VIPER
2021-04-14 04:02:14 +07:00
2021-04-10 04:13:06 +07:00
## UIDesign
2021-04-10 03:58:50 +07:00
2021-04-10 04:16:24 +07:00
### HIG(Human Interface Guidelines)
2021-04-10 14:51:46 +07:00
- [Apple UI Kit](https://developer.apple.com/documentation/uikit)
2021-05-03 10:58:56 +07:00
- [iOS Design Guide](https://ivomynttinen.com/blog/ios-design-guidelines)
2021-04-10 04:16:24 +07:00
2021-04-10 04:13:06 +07:00
### iOS icon
2021-04-10 04:12:26 +07:00
2021-05-05 17:35:44 +07:00
- [icon8](https://icons8.com/) You can download icons imge for your **APP**
2021-05-05 17:36:18 +07:00
- [appicon](https://appicon.co/) generate the app icon size
2021-04-10 03:58:50 +07:00
2021-04-10 04:13:06 +07:00
### UIdesign inspiration
2021-04-10 03:58:50 +07:00
2021-04-10 04:33:17 +07:00
- [dribble](https://dribbble.com/)
- [pinterest](https://pinterest.com/)
- [behance](https://www.behance.net/)
- [pttrns](https://pttrns.com/)
- [awwwards](https://www.awwwards.com/)
- [flickr](http://www.flickr.com/)
- [mobbin](https://mobbin.design/)
## Helper
2021-04-22 17:06:56 +07:00
2021-05-03 13:57:35 +07:00
All files are resuable files and protocol oriented. **Just Copy and Paste inside your project and use it!!** 👍
2021-05-03 16:51:46 +07:00
## Email, Message, Call
2021-05-03 13:57:35 +07:00
2021-04-22 17:06:56 +07:00
You can check the file in the follow link
- [Email, Message, Call](https://github.com/jphong1111/Useful_Swift/blob/main/Helper/ConversationManager.swift)
2021-05-03 18:21:44 +07:00
### Usage
2021-04-22 17:14:29 +07:00
import MesaageUI first
```swift
import MessageUI
```
Then use it
2021-05-03 18:29:22 +07:00
> Don't forget to extend the mail, message delegate to your ViewController!
2021-04-22 17:14:29 +07:00
```swift
2021-05-03 18:29:22 +07:00
lazy var conversation = ConversationManager(presentingController: self, mailDelegate: self, messageDelegate: self, viewController: self)
2021-05-03 18:29:22 +07:00
@IBAction private func sendEmail(_ sender: UIButton) {
conversation.sendEmail(feedback: MailFeedback(recipients: ["abcd@google.com"], subject: "FeedBack", body: "Write feedback here"))
}
2021-05-03 18:29:22 +07:00
@IBAction private func sendMessage(_ sender: UIButton) {
conversation.sendMessage(feedback: MessageFeedBack(recipients: ["1111111111"], body: "Type here"))
}
2021-05-03 18:29:22 +07:00
@IBAction private func startCall(_ sender: UIButton) {
conversation.makeCall(number: "1111111111")
}
```
2021-04-10 03:58:50 +07:00
2021-05-03 18:41:57 +07:00
Good To GO 👏👏👏
> See Example [here](https://github.com/jphong1111/ImageMessageHandler_DemoApp)
2021-05-03 16:51:46 +07:00
## Network Layer
2021-05-03 13:57:35 +07:00
2021-05-03 13:58:22 +07:00
- [Network Layer](https://github.com/jphong1111/Useful_Swift/tree/main/Helper/Network%20Layer)
2021-05-03 13:57:35 +07:00
2021-05-03 16:51:46 +07:00
### Usage
2021-05-03 14:26:28 +07:00
First, set the base URL in **EndPointType file**
2021-05-03 17:05:30 +07:00
> Don't forget to put your API key in it!
2021-05-03 14:26:28 +07:00
```swift
var baseURL: URL {
guard let url = URL(string: "https://api.openweathermap.org/data/2.5/") else {
fatalError("baseURL could not be configured.")
}
return url
}
```
then make a instance of router.swift file in your code
```swift
private let router = Router<YourAPI>()
```
2021-05-03 14:27:54 +07:00
for **YourAPI part**, simply create a new **enum** with cases about specific api URL
2021-05-03 14:26:28 +07:00
> It will make your router more dynamic!
> Don't forget extension to EndPointType!
```swift
enum YourAPI {
case first(country: String)
case second(time: Int)
case third(name: String)
}
extension YourAPI: EndPointType {
var path: String {
switch self {
case .first(let country):
return "\(country).json"
case .second(let time):
return "\(time).json"
2021-05-03 14:27:54 +07:00
case .third(let name):
2021-05-03 14:26:28 +07:00
return "\(name).json"
}
}
}
```
then, use it like this
```swift
router.request(.first(country: London)) { [weak self] (results: Result<CountryWeather, AppError>) in
guard let self = self else { return }
switch results {
case .success(let data):
// insert your modifications!
case .failure(let error):
// insert your modifications!
print(error)
}
}
```
> **CountryWeather should be a model with Decodable**
2021-05-03 14:29:43 +07:00
This reusable network layer files for referenced from [here](https://medium.com/flawless-app-stories/writing-network-layer-in-swift-protocol-oriented-approach-4fa40ef1f908)
2021-05-03 16:51:46 +07:00
## Image Picker
2021-05-03 16:50:11 +07:00
2021-05-06 00:51:33 +07:00
- [Image Picker](https://github.com/jphong1111/Useful_Swift/blob/main/Helper/ImagePickerHandler/ImagePicker.swift)
2021-05-03 16:50:11 +07:00
2021-05-03 16:51:46 +07:00
### Usage
2021-05-03 16:50:11 +07:00
Copy and Paste in your project and then declare Image Picker object inside your project
```swift
lazy var imagePicker = ImagePicker(presentationController: self, delegate: self)
```
Then, extend ImagePickerDelegate to your viewController
```swift
extension ViewController: ImagePickerDelegate {
func didSelect(image: UIImage?) {
self.yourImageView.image = image
self.dismiss(animated: true, completion: nil)
}
}
```
Good To GO 👏👏👏
> See Example [here](https://github.com/jphong1111/ImageMessageHandler_DemoApp)
2021-05-03 18:21:44 +07:00
## File Manager
2021-05-03 18:46:08 +07:00
- [File Manager](https://github.com/jphong1111/Useful_Swift/blob/main/Helper/FileManageHelper.swift)
### Usage
Copy and Paste in your project
```swift
let readData = FileManageHelper.manager.readFile(filename: fileNameTextField.text ?? "", type: extensionTextField.text ?? "")
resultTextField.text = readData
```
> File Manager are wrote with singleton pattern, therefore no need to declare in side your code!
2021-05-03 18:21:44 +07:00
2021-05-03 18:51:05 +07:00
Good To GO 👏👏👏
2021-05-03 18:21:44 +07:00
## Video Downloader
2021-05-03 18:51:05 +07:00
- [Video Downloader](https://github.com/jphong1111/Useful_Swift/blob/main/Helper/VideoManager.swift)
## Usage
Make an object of VideoManager inside your code
```swift
let videoManager = VideoManager()
```
use downloadVideoLinkAndCreateAsset function to start download with entering URL
```swift
self.videoManager.downloadVideoLinkAndCreateAsset(text)
```
Good To GO 👏👏👏
2021-05-03 18:21:44 +07:00
2021-05-03 19:09:09 +07:00
## Location Manager
2021-05-06 00:50:10 +07:00
- [Location Manager](https://github.com/jphong1111/Useful_Swift/tree/main/Helper/LocationHandler/LocationManager.swift)
2021-05-03 19:09:09 +07:00
2021-04-10 04:13:06 +07:00
## API
2021-04-10 04:12:26 +07:00
2021-05-01 09:20:43 +07:00
API(Application Programming Interface) is an interface that defines interactions between multiple software applications or mixed hardware-software intermediaries. It defines the kinds of calls or requests that can be made, how to make them, the data formats that should be used, the conventions to follow, etc.
2021-04-10 04:30:48 +07:00
2021-04-10 15:55:09 +07:00
## JSON
2021-04-10 15:58:08 +07:00
JSON is a language-independent data format
2021-04-10 16:01:31 +07:00
> Which is relative with **KEY - VALUE** pair
2021-04-10 16:30:44 +07:00
```json
2021-04-10 15:58:08 +07:00
{
2021-04-10 16:00:40 +07:00
"main": [
2021-04-10 15:58:08 +07:00
{
2021-04-10 16:00:40 +07:00
"title": "example1",
2021-04-10 16:31:31 +07:00
"body": "body1"
2021-04-10 15:58:08 +07:00
},
{
2021-04-10 16:00:40 +07:00
"title": "example2",
2021-04-10 16:31:31 +07:00
"body: "body2"
2021-04-25 04:53:10 +07:00
}
2021-04-10 15:58:08 +07:00
]
}
2021-04-10 16:00:40 +07:00
```
2021-04-10 15:55:09 +07:00
### JSON parser extension for Chrome
2021-04-10 16:05:27 +07:00
This extension makes JSON more structable
2021-04-10 15:55:09 +07:00
[JSON parser pro](https://chrome.google.com/webstore/detail/json-viewer-pro/eifflpmocdbdmepbjaopkkhbfmdgijcc) **FREE** :+1:
2021-04-10 16:15:30 +07:00
### JSON Decoding
2021-05-01 09:20:43 +07:00
To use JSON Decoding in swift, you have to define the model to be Codable or Decodable
```swift
public typealias Codable = Decodable & Encodable
```
> Decodable can only decode the json data. Can't encoded json file!!
```swift
struct User: Codable {
var first_name: String
var last_name: String
var country: String
}
```
2021-04-10 16:15:30 +07:00
### JSONSerialization
2021-05-01 09:20:43 +07:00
### Various API Site
- [rapidAPI](https://www.rapidapi.com)
2021-04-29 11:42:01 +07:00
## GCD
GCD(Grand Central Dispatch) is a low-level API for managing concurrent operations. It can help you improve your apps responsiveness by deferring computationally expensive tasks to the background.
2021-04-10 16:15:30 +07:00
2021-04-30 13:40:48 +07:00
### DispatchQueue
2021-04-30 14:06:31 +07:00
An object that manages the execution of tasks serially or concurrently on your app's main thread or on a background thread.
2021-04-30 13:40:48 +07:00
#### main
2021-04-30 14:06:31 +07:00
We can say main is a serial queue
2021-04-30 13:40:48 +07:00
#### global()
2021-04-30 14:06:31 +07:00
We can say global is a concurrent queue
2021-04-30 13:40:48 +07:00
### DispatchGroup
### DispatchWorkItem
2021-04-30 17:16:16 +07:00
### Thread Sanitizer
Thread Sanitizer is a tool to identifies the potential thread-related corruption issues. And it is a good way to find the [Readers and Writers problem](https://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem) in your application.
2021-04-30 13:58:38 +07:00
#### How to Use Address Sanitizer
Go to this Option and Click **EDIT SCHEME...** 👈
2021-04-30 14:01:13 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/address_sanitizer.png">
2021-04-30 17:16:16 +07:00
And then go to **RUN** and check **THREAD SANITIZER** 👈
2021-04-30 13:58:38 +07:00
2021-04-30 17:18:31 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/thread_sanitizer.png">
2021-04-30 13:40:48 +07:00
2021-04-10 04:30:48 +07:00
## Third Party Library
2021-04-10 15:33:33 +07:00
[This github](https://github.com/vsouza/awesome-ios) contains all the popular libraries in Swift:+1:
2021-04-23 14:19:47 +07:00
## Useful Stuff
2021-04-23 14:25:02 +07:00
### Show Preview in UIKit(Build UI with Code Base) 👍 👍 👍 👍 👍
Copy this code and Paste into your controller
2021-04-23 14:19:47 +07:00
```swift
2021-05-05 01:37:42 +07:00
#if canImport(SwiftUI) && DEBUG
2021-04-23 14:19:47 +07:00
import SwiftUI
2021-05-05 01:37:42 +07:00
struct SwiftLeeViewRepresentable: UIViewRepresentable {
func makeUIView(context: Context) -> UIView {
return UIStoryboard(name: "Main", bundle: Bundle.main).instantiateInitialViewController()!.view
2021-04-23 14:19:47 +07:00
}
2021-05-05 01:37:42 +07:00
func updateUIView(_ view: UIView, context: Context) {
2021-04-23 14:19:47 +07:00
}
}
2021-05-05 01:37:42 +07:00
@available(iOS 13.0, *)
struct SwiftLeeViewController_Preview: PreviewProvider {
2021-04-23 14:19:47 +07:00
static var previews: some View {
2021-05-05 01:37:42 +07:00
SwiftLeeViewRepresentable()
2021-04-23 14:19:47 +07:00
}
}
2021-05-05 01:37:42 +07:00
#endif
2021-04-23 14:19:47 +07:00
```
2021-04-23 14:25:02 +07:00
Enable canvas option like this
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/preview%20using%20canvas.png">
2021-04-23 14:34:10 +07:00
**You are GOOD TO GO** 👏👏👏
2021-04-23 14:38:50 +07:00
2021-04-23 14:39:56 +07:00
<img src="https://github.com/jphong1111/Useful_Swift/blob/main/Images/preivew_screenShot.png">
2021-04-24 00:01:19 +07:00
## Write README.md
2021-04-24 00:01:53 +07:00
[This](https://medium.com/@saumya.ranjan/how-to-write-a-readme-md-file-markdown-file-20cb7cbcd6f) will help you to write a README.md file more dynamically 👍
2021-05-01 09:22:58 +07:00
## Author
2021-05-01 09:23:20 +07:00
This README.md file is written by **Jungpyo Hong (Dennis)**