- ๋ด๊ฐ ๋ณด๊ธฐ ์ํด ๋ฉ๋ชจํ๋ ํค์๋(๋๋ฌด ์์ธํ๊ฒ ์ ์ผ๋ ค๊ณ ๋ถ๋ด๊ฐ์ง ๋ง๊ธฐ)
- ์ด๋ฏธ ์๊ณ ์๋ ๋ด์ฉ์ด๋๋ผ๋ ์ ๊ณ ๋ค์ ์๊ฐํ๊ณ ์๋ฌธ์ ๊ฐ๊ธฐ
1. Alamofire ์ค๋ณต ์ฝ๋ ๊ฐ์ ํ๊ธฐ
import Foundation
import Alamofire
final class Network {
static let shared = Network()
private init() {}
}
extension Network {
func request<T: Decodable>(
_ type: T.Type = T.self,
url: URL,
method: HTTPMethod = .get,
parameters: [String: String]? = nil,
headers: HTTPHeaders,
completion: @escaping (Result<T, Error>) -> Void
) {
AF.request(url, method: .get, parameters: parameters, headers: headers)
.responseDecodable(of: T.self) { response in
switch response.result {
case .success(let data):
completion(.success(data))
case .failure:
guard let statusCode = response.response?.statusCode else { return }
guard let error = SeSACError(rawValue: statusCode) else { return }
completion(.failure(error))
}
}
}
}
- Generic ๋ฉ์๋์ ์ธ์๋ก ๋ค์ด์ค๋ ๊ฐ์ ํ๋กํ ์ฝ๋ก ๋ฌถ์ด์ฃผ๋ฉด ์ด๋จ๊น?
- https://taekki-dev.tistory.com/23 (URLRequestConvertible ํ๋กํ ์ฝ๋ก ๊ฐ์ ํด๋ณผ ์ ์์, ์๋ ์ ์ด ๊ธ์ด ์์๋ค..)
2. Generic Type
- Placeholder๋ก์ ์ญํ
- ๋ชจ๋ ํ์ ์ด ๋ค์ด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ฝ์ ๊ฑธ์ด์ฃผ๋ ๊ฒ์ด ํ์ํจ
3. Meta Type
- ํ์ ์ ํ์
- ํ์ ์์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์กด์ฌ
- ํ์ ์ด๋ ๋ฉํํ์ ์ ์ธ์คํด์ค
4. Escaping Closure/Auto Closure
5. Result Type
- ๋คํธ์ํฌ ํต์ ์ํ์ ๊ฒฐ๊ณผ๋ ์ฑ๊ณต ๋๋ ์คํจ ์ค ํ๋์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๊ฒจ๋ ํ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
@frozen public enum Result<Success, Failure> where Failure : Error {
/// A success, storing a `Success` value.
case success(Success)
/// A failure, storing a `Failure` value.
case failure(Failure)
}
- @Frozen : ์ผ์ด์ค๊ฐ ๋์ด์ ์ถ๊ฐ๋์ง ์์ ๊ฒ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ ์ฑ๋ฅ ํฅ์
6. Error
- Error๋ Sendable์ ์ฑํํ๋ ํ๋กํ ์ฝ ํ์ ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ํต์ ์์ ๋ฐ์ํ ์ ์๋ ์๋ฌ์ ์ข ๋ฅ๋ ๋ค์ํ๊ธฐ ๋๋ฌธ์, Error๋ฅผ ์ฑํํ์ฌ Customํ Errorํ์ ์ ์ ํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
- ์ด๊ฑฐํ๊ณผ ์ฎ์ด์ ์ฌ์ฉํด๋ณผ ์ ์๋ค.
- ๋ฒ์ฉ์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ ์ถ๊ฐํด๋ณผ ์ ์๋ค. (Offline ์ํ)
enum SeSACError: Int, Error {
case invalidAuthorization = 401
case takenEmail = 406
case emptyParameters = 501
}
extension SeSACError: LocalizedError {
var errorDescription: String? {
switch self {
case .invalidAuthorization:
return "ํ ํฐ์ด ๋ง๋ฃ๋์์ต๋๋ค. ๋ค์ ๋ก๊ทธ์ธ ํด์ฃผ์ธ์."
case .takenEmail:
return "์ด๋ฏธ ๊ฐ์
๋ ํ์์
๋๋ค. ๋ก๊ทธ์ธ ํด์ฃผ์ธ์."
case .emptyParameters:
return "ํ์ํ ์ ๋ณด๊ฐ ์์ต๋๋ค."
}
}
}
guard let error = SeSACError(rawValue: statusCode) else { return }
7. ์บ์
- shorturl.at/ryY05
์บ์ ์ข ๋ฅ
์๋์ ์ฉ๋ ์ธก๋ฉด์์ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ ์ฌ์ฉ ํ์
- ์บ์ ๋ฉ๋ชจ๋ฆฌ(๋ฉ๋ชจ๋ฆฌ ์บ์)
- ๋์คํฌ ์บ์
8. RxSwift
- Single Traits : ๊ฐ๋ ์์ฒด๋ ์ด๋ ต์ง ์๋ค. ๊ทธ๋ฐ๋ฐ ๊ตฌ์กฐ์ ์ธ ์ธก๋ฉด์์ ํ์ฉํ๋๊ฒ ๊ฐ์ด ์ ์์์ ์ข ํค๋งธ๋ค.
- subscribe, bind, drive
- Driver vs Signal
9. Copy on Write (CoW)
- ์ค์ ๊ฐ์ ์์ ๋๋ ์ญ์ ๋ฑ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ฌ๋ผ์ง๋ค.
- Collection ํ์ (Array, Dictionary, Set)์ ๋ํด์ ์ฑ๋ฅ ์ต์ ํ ์ ๊ณต
// ํฌ์ธํฐ ์ฃผ์๋ฅผ ์์๋ณด์
func address(_ value: UnsafeRawPointer) {
let address = String(format: "%p", Int(bitPattern: value)) // pointer ์ถ์
print(address)
}
10. ์๋ธ์คํฌ๋ฆฝํธ(Subscript)
- ํน์ ๋ฉค๋ฒ ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฌธ๋ฒ
- ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ ๊ตฌํ์ด ๋์ด ์์
- String์์ ์ฐ๋ฉด ์ ์ฉํ ๊ฒ์ผ๋ก ์๊ฐํจ(ํนํ ์ฝํ )
extension String {
// "abcde" >>> [1] >>> b
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil // early exit
}
let result = index(startIndex, offsetBy: idx)
return String(self[result])
}
}
11. ETC
- ARC
- final, AnyObject
- ์ ๊ทผ์ ์ด
- ๊ฐ์ ํด์ ์ฐ์ฐ์ ์ง์
- ์์ฐ๋ ์ฝ๋, ํ์ผ ์ ๊ฑฐ(print, ์ฃผ์, storyboard ๋ฑ)
- Appearance
- ํธ์ถํ ์์ ๋ถํฐ ๋ชจ๋ ๊ณณ์ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์, AppDelegate or SceneDelegate์์ ํธ์ถํด์ฃผ๋ ๊ฒ์ด ์ ์ ํ ์ ์๋ค.
- Available(*, unavailable)
- DTO
- ์๋ณธ ๋ฐ์ดํฐ์ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํด๋ณผ ์ ์๋ค.
'๐ฑ SeSAC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SeSAC] 220826 TIL (0) | 2022.08.29 |
---|---|
[SeSAC] 220825 TIL (0) | 2022.08.29 |
[SeSAC] 220824 TIL (0) | 2022.08.29 |
[SeSAC] 220823 TIL (0) | 2022.08.29 |
[SeSAC] 220822 TIL (0) | 2022.08.29 |