ios
[Swift] 고차함수(2) - filter, reduce
이번 포스팅에서는 스위프트의 고차함수인 filter, reduce를 이용하여 데이터 연산을 쉽게 수행하는 방법을 알아보고자 한다. filter와 reduce는 어떤 함수이고, 어떻게 작동하는지 살펴보자 filter 필터는 말 그대로 컨테이너 내부의 값을 걸러서 추출하는 역할을 하는 고차함수이다. 맵과 마찬가지로 새로운 컨테이너에 값을 담아 반환해준다. 다만 맵처럼 기존 콘텐츠를 변형하는 것이 아니라, 특정 조건에 맞게 걸러내는 역할을 한다는 점에서 차이가 있다. filter 함수의 매개변수로 전달되는 함수의 반환 타입은 Bool형이다. 해당 콘텐츠의 값으로 새로운 컨테이너에 포함될 항목이라고 판단하면 true를, 포함하지 않으려면 false를 반환해주면 된다. 사용 예제 다음은 필터 메서드의 간단한 사용..
[Swift] 고차함수(1) - map, flatMap, compactMap
스위프트에서는 함수를 일급 객체로 취급한다. 따라서 함수를 다른 함수의 전달 인자로 사용할 수 있다. 매개변수로 함수를 갖는 함수를 고차 함수라고 부르는데, 그중 map, flatMap, compactMap에 대해 알아볼 예정이다. map 맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수이다. 스위프트에서 맵은 배열, 딕셔너리, 세트, 옵셔널 등에서 사용할 수 있다. 조금 더 정확히 말하자면 Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있다. 맵을 사용 하면 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 새 컨테이너에 포장하여 반환한다. 기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 ..
[Swift] RunLoop.Mode
오늘은 미루고 미룬 런 루프 모드에 관해 정리해 보고자 한다. 조금 심화적인 내용을 다룰 것이기 때문에 Run loop의 개념 정도는 알고 있어야 읽기 수월하다. Run loop의 기본적인 개념을 정리한 글은 여기 그럼 시작 RunLoop.Mode? Run Loop 모드는 루프를 통과하는 동안 특정 소스만 모니터링하기 위해 사용한다. 즉, 모드를 사용하여 루프를 통과하는 동안 원치 않는 소스에 대한 이벤트를 필터링할 수 있다. 예를 들어 마우스나 키보드와 같은 입력 소스에 대한 이벤트만 처리하고 싶을 때나, 입력 소스와 타이머 소스 모두 처리하고 싶을 때 특정 모드로 설정하여 제어할 수가 있다. 주의: 모드는 이벤트가 발생하는 소스를 기준으로 구별하기 위함이지, 이벤트의 타입을 구별하는 용도는 아님 예를..
[Swift] Run Loop
오늘은 Run loop에 대해서 공부해 볼 것이다. 이전 플젝에서 combine을 사용했었는데, 서버에서 가져온 데이터를 ui에 반영해 주기 위해 receive(on: Runloop.main) 메서드를 썼던 경험이 있다. 그때는 뭣도 모르고 ui 관련 동작이니 main 스레드에서 돌릴 때 쓰는 거구나 했는데 이번 기회에 자세히 알아볼 생각이다. Run Loop? 우선 Run loop가 뭔지부터 알고 가자 apple document를 토대로 정리해 보면 Run loop는 파일, 키보드, 마우스 등의 입력 소스를 처리하는 이벤트 처리 루프이다. Run loop의 관점에서는 특수한 케이스지만 Timer의 이벤트 또한 처리한다. 특정 이벤트가 왔을 때 Thread가 일해야 할 때는 일하고, 일이 없으면 쉬도록 ..
[Swift] Initializer 심화 (2)
지난 글에서는 지정 이니셜라이저와 편의 이니셜라이저, 그리고 초기화 단계에 대해 살펴보았다. 여기서는 이니셜라이저의 상속에 관해 다루려고 한다. 그럼 시작 이니셜라이저의 상속 및 재정의 기본적으로 스위프트의 이니셜라이저는 부모 클래스의 이니셜라이저를 상속받지 않는다. > 부모 클래스로부터 물려받은 이니셜라이저는 자식 클래스에 최적화되어 있지 않아서, 부모 클래스의 이니셜 라이저를 사용했을 때 자식 클래스의 새로운 인스턴스가 완전하고 정확하게 초기화되지 않는 상황을 방지하고자 함 > but, 안전하고 적절하다고 판단되는 특정한 상황에서는 예외 케이스도 존재함 그건 밑에서 다룰 예정 부모 클래스와 동일한 지정 이니셜라이저를 자식 클래스에서 구현해주려면 재정의하면 됨 방법은 간단하다. init 앞에 overr..
[Swift] Initializer 심화 (1)
convenience init.. required init 등 제대로 알고 쓰자 싶어서 쓰는 글 클래스에서는 지정 이니셜라이저와 편의 이니셜라이저로 두 종류의 이니셜라이저가 존재한다. 그리고 상속이라는 클래스의 특성 때문에 다양한 패턴의 이니셜라이저가 생길 수 있다. 기본적인 이니셜라이저보다는 조금 심화된 내용인 클래스 이니셜라이저에 대해 살펴보자 지정 이니셜라이저(Designated Initializer) 클래스의 주요 이니셜라이저 필요에 따라 부모 클래스의 이니셜라이저를 호출할 수 있으며, 이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화해야 하는 임무를 갖고 있음 한 개 이상 정의해야 함 조상 클래스에서 지정 이니셜라이저가 자손 클래스의 지정 이니셜라이저 역할을 충분히 할 수 있다면, 자손 클래..
[iOS] Core Animation
CALayer를 공부하다 보니 Core Animation에 대한 배경지식도 알고 있어야 할 것 같아서 쓰는 글이다. 아래는 Core Animation 공식 문서의 개요 부분을 간단히 정리해 보았다. Core Animation? Core Animation은 iOS와 OS X에서 사용할 수 있는 그래픽 렌더링 및 애니메이션 인프라로, 앱 내의 view 및 기타 시각적 요소를 animate 하는 데 사용한다. Core Animation을 사용하면 애니메이션 각각의 프레임을 짜는데 필요한 대부분의 작업이 자동으로 수행된다. 몇 가지 animation 매개변수를 구성하고(ex. 시작 지점 및 끝나는 지점) 시작하도록 지시만 하면 된다. 대부분의 실제 그리기 작업은 렌더링 가속화를 위해 메인 보드에 부착되어 있는 ..
[iOS] CALayer
CALayer의 등장 배경 CALayer에서 CA는 Core Animation의 약자 CALayer는 Core Animation이 제공하는 요소 중 하나이다. 우리가 iOS 앱을 사용할 때 화면이 끊기지 않고 "부드럽게" 그려지게 하기 위해선 초당 60 프레임의 속도가 필요함 이 속도를 유지하기 위해 GPU에서 직접 실행되는, 그래픽에 매우 강력한 OpenGL이 생겨남 OpenGL은 그래픽 하드웨어에 가장 빠른 액세스를 제공함 but, 간단한 작업에도 매우 많은 양의 코드가 필요한 단점이 있었다. 그래서 더 적은 코드로 그래픽을 구현할 수 있는 Core Graphics가 생겨났고, 이후 Core Graphics 작업을 더욱 간단하게 하기 위해 Core Animation이 등장 Core Animation에..