본문 바로가기

Swift

(18)
[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 입니다. 즉, 실행이 완료된 인스턴스는 다시 실행할 수 없습니다. 동일한 작업을 반복해야하는 경우에는 매번 새로..
[Swift] Computed Property 는 언제 쓰는지 알아보자 Computed Property를 직역하면 계산된 속성이 됩니다. 하지만 수학적 계산이 실행된다는 의미는 아닙니다. 다른 속성을 기반으로 해당 속성 값이 결정된다는 의미입니다. 저장 속성(Stored Property)은 값을 저장할 메모리 공간을 가지고 있습니다. 반면에, 연산 프로퍼티(Computed Property)는 메모리 공간을 가지지 않습니다. 다른 속성에 저장된 값을 읽어서 필요한 계산을 실행한 다음 반환(return)하는 것입니다. 또한 연산 프로퍼티에 값을 할당하는 것은 속성으로 전달된 값을 다른 속성에 저장하는 것입니다. 이런 특징 때문에 속성에 접근할 때마다 다른 값이 반환될 수 있습니다. 그러므로 연산 프로퍼티는 let이 아닌 var로 선언해야합니다. 저장 속성은 클래스, 구조체에만 ..
[Swift] lazy var ? Lazy Stored Property 에 대하여 지연 저장 속성 (Lazy Stored Property) 은 인스턴스가 초기화 되는 시점이 아니라 속성에 처음 접근하는 시점에 초기화됩니다. lazy 키워드를 사용하여 선언하는 방법은 아래와 같습니다. lazy var name: Type = DefaultValue 초기화 시점이 지연되기 때문에 몇 가지 제한이 있습니다. 인스턴스가 초기화된 이후에 지연 저장 속성은 개별적으로 초기화가 됩니다. 그렇기 때문에 변수(lazy var)가 아닌 상수(lazy let)로 선언은 불가능 합니다. 또한 생성자에서 초기화 하지 않기 때문에 선언 시점에 기본값을 저장해주어야 합니다. 이미지를 저장하는 구조체 예제를 살펴보겠습니다. struct Image { init() { print("New Image") } } 예제이므..
[Swift] Namespace 네임스페이스 란? (Struct, Enum 활용) 다른 라이브러리, 프레임워크와 이름이 충돌되지 않기 위해 Objective-C 클래스에는 고유한 이름이 있습니다. 애플이 UIView, CGRect, CALayer 와 같이 Objective-C 클래스에 접두어를 사용하는 이유입니다. 하지만 스위프트 모듈은 클래스 접두사가 필요하지 않습니다. 스위프트는 현재 모듈 내의 네임스페이스(Namespace) 유형과 상수에 대한 솔루션을 제공하지 않고 있습니다. 스위프트로 작업할 때 일반적인 문제는 프로젝트를 함께 진행하는 개발자 누구나 쉽게 이해하는 방식으로 상수를 정의하는 것입니다. Objective-C 에도 유사한 고민이 있습니다. 모든 상수에는 이름 충돌을 피하기 위해 두 개 또는 세 개의 글자가 앞에 붙고 용도를 설명합니다. NSString * const..