(의역주의) Naming 명확한 사용 애매모호하게 작성하지 않기 Good extension List { public mutating func remove(at position: Index) -> Element } employees.remove(at: x) Bad x를 없애는 것인지 x에서 없애는 것인지 모호함 employees.remove(x) // unclear: are we removing x? 불필요한 단어 생략 Good public mutating func remove(_ member: Element) -> Element? allViews.remove(cancelButton) // clearer Bad public mutating func removeElement(_ member: Element)..
extension으로 다음과 같이 만들어 줍니다. extension UINavigationController { // 완전 안보임 func hideNavigationBar() { navigationBar.isHidden = true } // 투명하게 만들기 (버튼 등은 보임) func changeNavigationBar(isClear: Bool) { navigationBar.isHidden = false if isClear { navigationBar.shadowImage = UIImage() navigationBar.setBackgroundImage(UIImage(), for: .default) } else { navigationBar.shadowImage = nil navigationBar.setBa..
NSCache key-value 쌍으로 된 임시적으로 저장하기위해 사용하는 가변 컬렉션으로 리소스가 부족할 때 제거 대상이 됩니다. class NSCache : NSObject where KeyType : AnyObject, ObjectType : AnyObject Cache 오브젝트가 다른 가변 컬렉션과 다른 점 시스템 메모리를 너무 많이 사용하지 않도록 자동 제거 정책이 포함되어 있는 클래스입니다. 만약에 다른 앱에서 메모리가 필요해지면 이 정책은 캐시의 아이템을 제거하고 메모리 공간을 최소화합니다. 캐시를 lock하지 않고 다른 쓰레드에서 추가 제거 쿼리할 수 있습니다. NSMutableDictionary와 다르게 캐시는 key 객체를 복사하지 않습니다. 생성하는데 비용이 큰 임시적인 데이터를 일시..
디자인패턴의 목적 기술부채 최소화 재사용 및 지속 가능 Model - View - ViewModel ViewController의 역할을 축소 할 일을 명확히 구분 -> 각 요소가 독립적 -> 테스트 용이 Model Model은 View 레이어와 소통하지 않음 ViewModel에 데이터 전달해줌 View ViewController는 View 레이어에 속함 ViewController는 View와 ViewModel을 가지고 있음 View는 Binding을 통해 화면을 표시함 ViewModel Model을 가지고 있음 ViewModel은 중계자 역할 Model에 데이터 요청