본문 바로가기

Swift

(21)
[iOS] Swift 참조 타입이 앱 기동 시간에 안 좋은 영향을 끼치는 이유 (번역) 앱 기동(launch) 경험은 앱 사용자에 대한 첫 인상입니다. 앱이 시작될 때까지 기다리는 시간은 수치상으로는 짧지만 실제로 짧게 느껴지지 않을 수 있는 중요한 시간입니다. 해당 앱을 하루에 여러번 사용되는 경우 사용자는 앱 기동을 계속해서 기다려야 합니다. Apple은 첫 번째 프레임을 400ms 미만으로 그릴 것을 권장합니다. 이렇게 하면 Springboard의 앱 열기 애니메이션이 완료 될 때 앱을 사용할 수 있습니다. 400ms 시간 내에서 개발자는 실수로 앱 시작 시간을 늘리지 않도록 유의해야 합니다. 그러나 앱 기동은 하는 일이 너무 많아서 정확히 어떤 것이 기동 시간을 늘리는지 알기가 어렵습니다. Swift 참조 유형이 바이너리 크기와 느려진 앱 시작 시간에 어떻게 영향을 미치는지 알아보도..
[Swift] Metatype 이란? (.Type, .self, .Protocol) (번역) 이번 포스팅에서는 Metatype에 대해 정확히 알아보고자 합니다. 실제로 자주 사용해왔지만 이것이 무엇이냐 묻는다면 정확히 답변하기는 어려웠을 것입니다. 각 접미사들의 차이는 정확히 무엇인지 알아보겠습니다. Metatype 이란? 애플 문서를 살펴보면 Metatype은 타입의 타입이라고 정의되어 있습니다. String 타입의 타입? 이미 타입인데 이 타입의 타입이 있다는 것이라고 합니다. 이론적으로는 이상하게 들리지만 Swift의 쉬운 사용성을 위해 이러한 세세한 사항들을 숨기는 Swift 문법에 익숙해 졌기 때문일 수 있습니다. struct Device { static let name = "iPhone" func turnOn(name: String) {} } let myPhone: Device = D..
[Swift] defer의 동작 원리는 무엇일까? (번역) Swift2에 도입된 defer는 실제로 많이 사용되진 않습니다. 그래서 보통 defer가 어떻게 동작하고 있는지 궁금해하지 않습니다. defer는 현재 scope에서 제일 끝에서 실행되어야하는 코드를 포함하는 클로저와 함께 사용되는 연산자입니다. 함수에 return문이 많고 각 return문 앞에 동일한 코드를 복사하여 붙여 넣어야 하는 경우 유용하게 사용됩니다. 또는 스레드로부터 안전한 동작을 구현하기 위해 로직을 실행하기 전에 NSLock 객체를 lock() 하였다면, defer { lock.unlock() } 을 함께 넣으면 교착 상태에 빠지거나 메모리 누수가 발생하는 걸 방지할 수 있습니다. 함수의 끝에서 실행된다는 것은 알고 있지만 정확히 어떻게 동작되는 것인지 자세히 살펴보도록 하겠습니다. ..
[iOS] NSPredicate 문법 정리 NSArray를 필터링 할 때, CoreData를 사용할 때 Predicate 문법을 사용하여 필터링 하곤 합니다. 이 때 주로 사용하는 문법들을 정리해보겠습니다. let request: NSFetchRequest = Entity.fetchRequest() let predicate = NSPredicate(format: "id == %@", id) request.predicate = predicate CoreData에서 데이터 조회(fetch)할 때 사용하는 방식은 대부분 위와 같을 것 입니다. NSPredicate 생성자 중 format 문자열에 검색조건을 지정하는 방법을 주로 사용합니다. format 문자열은 대소문자를 구별하지 않습니다. Predicate Keyword 들은 대문자로 작성하는 것이 ..
[iOS] 로컬 푸쉬 알림 구현 방법 (Local Notification) Swift로 로컬에서 푸쉬 알림을 어떻게 띄우게 구현하는지 알아보도록 하겠습니다. 기본 구조 Local Notification은 크게 3가지 파트로 나뉩니다. content, trigger, request 입니다. 이 세가지를 통하여 Local Notification을 쉽게 구현할 수 있습니다. Content content는 사용자에게 어떤 내용을 보여줄지에 대한 정보를 담고 있습니다. title, body, badge number, userInfo, attachments 등이 있습니다. userInfo는 예상하다시피 원하는 정보를 모두 담을 수 있는 Dictionary 입니다. 알림을 사용자가 눌렀을 때, userInfo에 들어있는 정보를 접근하여 활용할 수 있습니다. Trigger trigger에는 ..
[iOS] Keyframe Animation으로 애니메이션 구현하는 방법 순차적으로 애니메이션이 실행되어야 한다면 아래와 같이 UIView Animation 을 중첩하여 구현할 수 있습니다. UIView.animate(withDuration: 1.0, animations: { self.animate1() }, completion: { finished in UIView.animate(withDuration: 1.0, animations: { self.animate2() }, completion: { finished in UIView.animate(withDuration: 1.0, animations: { self.animate3() }) }) }) 중첩이 많아 가독성이 떨어져 보입니다. 애니메이션이 추가될 수록 더 악화될 것입니다. 이 코드는 아래처럼 animateKeyfram..
[iOS] UIView Animation으로 애니메이션 구현하는 방법 특정한 시간 동안 한 개 혹은 그 이상의 뷰들의 변화에 애니메이션을 주는 것에 대해 알아보겠습니다. 오늘은 그 중에서도 타입 메소드로 선언된 UIView.animate 를 살펴보겠습니다. class func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void) 파라미터 animations 에 원하는 속성의 최종값을 설정하면 현재값에서 최종값으로 변하는 애니메이션이 실행됩니다. UIView가 제공하는 속성중에서 애니메이션을 지원하는 속성은 다음과 같습니다. frame bounds center transform alpha backgroundColor 기본적인 구현 방법은 아래와 같습니다. let newFrame = CGR..
[iOS] Operation? Operation Queue? 작업을 객체로 만들어보자! 오퍼레이션(Operation)은 하나의 작업을 나타내는 객체입니다. 보통 오퍼레이션 클래스를 상속한 블록 오퍼레이션을 사용하거나 오퍼레이션 클래스를 서브클래싱하여 커스텀 오퍼레이션을 직접 구현합니다. 오퍼레이션을 사용할 때 얻는 이점 오퍼레이션 사이에 의존성을 추가하여 실행 순서를 제어할 수 있습니다. 실행 취소(cancel) 기능을 구현하고 컴플리션 핸들러(completion handler)를 추가하는데 필요한 API를 제공합니다. 오퍼레이션 상태를 감시할 때는 KVO를 활용하거나 오퍼레이션 클래스가 제공하는 속성을 사용합니다. 오퍼레이션의 특징 오퍼레이션은 Single-Shot Object 입니다. 즉, 실행이 완료된 인스턴스는 다시 실행할 수 없습니다. 동일한 작업을 반복해야하는 경우에는 매번 새로..