Taehyeon-Kim / SeSAC

☀️ SeSAC Daily Reporting
27 stars 0 forks source link

[221103] TIL #148

Open Taehyeon-Kim opened 2 years ago

Taehyeon-Kim commented 2 years ago

- 내가 보기 위해 메모하는 키워드(너무 자세하게 적으려고 부담갖지 말기) - 이미 알고 있는 내용이더라도 적고 다시 생각하고 의문점 갖기

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))
                }
            }
    }
}

2. Generic Type

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)
}

6. Error

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. 캐시

캐시 종류

속도와 용량 측면에서 차이가 있기 때문에 적절한 사용 필요

8. RxSwift

9. Copy on Write (CoW)

// 포인터 주소를 알아보자
func address(_ value: UnsafeRawPointer) {
    let address = String(format: "%p", Int(bitPattern: value))   // pointer 추적
    print(address)
}

10. 서브스크립트(Subscript)

11. 지켜보자