Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[220801] TIL #79

Closed
Taehyeon-Kim opened this issue Aug 1, 2022 · 0 comments
Closed

[220801] TIL #79

Taehyeon-Kim opened this issue Aug 1, 2022 · 0 comments
Assignees

Comments

@Taehyeon-Kim
Copy link
Owner

Taehyeon-Kim commented Aug 1, 2022

프로토콜과 String(describing: _)사용해서 리터럴한 값 덜어내기

그 동안 identifier 값을 쓰는 곳이 정말 많았다. ViewController와 TableViewCell, CollectionViewCell 등에서 많이 사용했었다. 매 클래스에서 하드코딩된 문자열 값을 넣는 대신 프로토콜을 이용하면 불편함과 반복을 줄일 수 있다.

protocol Reusable: Anyobject {
    static var reuseidentifier: String { get }
}

다음과 같이 extension에서 프로토콜을 채택하게 되면, 이제 reuseidentifier를 편하게 접근해서 사용할 수 있다.

extension UIViewController: ReusableViewProtocol {
    // 연산 프로퍼티의 형태로 나옴.
    // 연산 프로퍼티 get만 사용한다면 get 생략 가능.
    static var reuseidentifier: String {
        return String(describing: self)
    }
}

extension UITableViewCell: ReusableViewProtocol {
    static var reuseidentifier: String {
        return String(describing: self)
    }
}

상수값 관리하기

enum과 struct 이용하기

  • struct : 인스턴스를 누군가 생성해서 사용할 수 있음 (불필요한 메모리 차지, Rule break, 코드 일관성 저하 가능, 접근 제어를 통해 초기화 방지도 가능)
  • enum : 초기화 x, 타입 프로퍼티를 이용해서 namespace의 성격으로 사용 가능
enum StoryboardName: String {
    case main = "Main"
    case search = "Search"
    case setting = "Setting"
}
  • rawValue는 중복되어서는 안됨.
  • 100% 케이스가 고유한 상황이 아니라면 case 사용 x
struct StoryboardName {
    
    // 접근 제어를 통해 초기화 방지
    private init() {}
    
    static let main = "Main"
    static let search = "Search"
    static let setting = "Setting"
}
enum StoryboardName {
    static let main = "Main"
    static let search = "Search"
    static let setting = "Setting"
}

UserDefaultsHelper

  • 타입 저장 프로퍼티 + 싱글톤 패턴
  • 열거형으로 Key 관리
  • 연산 프로퍼티 사용
class UserDefaultsHelper {
    
    // shared or standard
    static let standard = UserDefaultsHelper()
    let userDefaults = UserDefaults.standard 
    // singleton pattern
    // 자기 자신의 인스턴스를 타입 프로퍼티 형태로 가지고 있음
    
    private init() {}  // 불필요한 인스턴스 생성 방지
    
    enum Key: String {
        case nickname, age
    }
    
    var nickname: String {
        get {
            return userDefaults.string(forKey: Key.nickname.rawValue) ?? "대장"
        }
        set { // 연산 프로퍼티 parameter
            userDefaults.set(newValue, forKey: Key.nickname.rawValue)
        }
    }
    
    var age: Int {
        get {
            // defaults가 0이라 nil이 아님
            return userDefaults.integer(forKey: Key.age.rawValue)
        }
        set {
            userDefaults.set(newValue, forKey: Key.age.rawValue)
        }
    }
}

네트워크 통신

  1. 요청이 있어야 응답을 한다.
  2. 요청 시 구체적인 요청 방식이 필요하다.
  3. 인증키가 필요하다. (달라는대로 다 주지 않는다.)

구성 요소

  • HTTP Methods
  • Status Code
  • JSON, XML
  • API (규칙)
  • 인증키

API 테스트 툴

  • Insomnia
  • Postman

Library

  1. Alamofire
  2. SwiftyJSON
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant