Study/Swift

    [Swift] 고차함수(2) - filter, reduce

    [Swift] 고차함수(2) - filter, reduce

    이번 포스팅에서는 스위프트의 고차함수인 filter, reduce를 이용하여 데이터 연산을 쉽게 수행하는 방법을 알아보고자 한다. filter와 reduce는 어떤 함수이고, 어떻게 작동하는지 살펴보자 filter 필터는 말 그대로 컨테이너 내부의 값을 걸러서 추출하는 역할을 하는 고차함수이다. 맵과 마찬가지로 새로운 컨테이너에 값을 담아 반환해준다. 다만 맵처럼 기존 콘텐츠를 변형하는 것이 아니라, 특정 조건에 맞게 걸러내는 역할을 한다는 점에서 차이가 있다. filter 함수의 매개변수로 전달되는 함수의 반환 타입은 Bool형이다. 해당 콘텐츠의 값으로 새로운 컨테이너에 포함될 항목이라고 판단하면 true를, 포함하지 않으려면 false를 반환해주면 된다. 사용 예제 다음은 필터 메서드의 간단한 사용..

    [Swift] 고차함수(1) - map, flatMap, compactMap

    [Swift] 고차함수(1) - map, flatMap, compactMap

    스위프트에서는 함수를 일급 객체로 취급한다. 따라서 함수를 다른 함수의 전달 인자로 사용할 수 있다. 매개변수로 함수를 갖는 함수를 고차 함수라고 부르는데, 그중 map, flatMap, compactMap에 대해 알아볼 예정이다. map 맵은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결과를 다시 반환해주는 함수이다. 스위프트에서 맵은 배열, 딕셔너리, 세트, 옵셔널 등에서 사용할 수 있다. 조금 더 정확히 말하자면 Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있다. 맵을 사용 하면 컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 새 컨테이너에 포장하여 반환한다. 기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 ..

    [Swift] RunLoop.Mode

    [Swift] RunLoop.Mode

    오늘은 미루고 미룬 런 루프 모드에 관해 정리해 보고자 한다. 조금 심화적인 내용을 다룰 것이기 때문에 Run loop의 개념 정도는 알고 있어야 읽기 수월하다. Run loop의 기본적인 개념을 정리한 글은 여기 그럼 시작 RunLoop.Mode? Run Loop 모드는 루프를 통과하는 동안 특정 소스만 모니터링하기 위해 사용한다. 즉, 모드를 사용하여 루프를 통과하는 동안 원치 않는 소스에 대한 이벤트를 필터링할 수 있다. 예를 들어 마우스나 키보드와 같은 입력 소스에 대한 이벤트만 처리하고 싶을 때나, 입력 소스와 타이머 소스 모두 처리하고 싶을 때 특정 모드로 설정하여 제어할 수가 있다. 주의: 모드는 이벤트가 발생하는 소스를 기준으로 구별하기 위함이지, 이벤트의 타입을 구별하는 용도는 아님 예를..

    [Swift] 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)

    [Swift] Initializer 심화 (2)

    지난 글에서는 지정 이니셜라이저와 편의 이니셜라이저, 그리고 초기화 단계에 대해 살펴보았다. 여기서는 이니셜라이저의 상속에 관해 다루려고 한다. 그럼 시작 이니셜라이저의 상속 및 재정의 기본적으로 스위프트의 이니셜라이저는 부모 클래스의 이니셜라이저를 상속받지 않는다. > 부모 클래스로부터 물려받은 이니셜라이저는 자식 클래스에 최적화되어 있지 않아서, 부모 클래스의 이니셜 라이저를 사용했을 때 자식 클래스의 새로운 인스턴스가 완전하고 정확하게 초기화되지 않는 상황을 방지하고자 함 > but, 안전하고 적절하다고 판단되는 특정한 상황에서는 예외 케이스도 존재함 그건 밑에서 다룰 예정 부모 클래스와 동일한 지정 이니셜라이저를 자식 클래스에서 구현해주려면 재정의하면 됨 방법은 간단하다. init 앞에 overr..

    [Swift] Initializer 심화 (1)

    [Swift] Initializer 심화 (1)

    convenience init.. required init 등 제대로 알고 쓰자 싶어서 쓰는 글 클래스에서는 지정 이니셜라이저와 편의 이니셜라이저로 두 종류의 이니셜라이저가 존재한다. 그리고 상속이라는 클래스의 특성 때문에 다양한 패턴의 이니셜라이저가 생길 수 있다. 기본적인 이니셜라이저보다는 조금 심화된 내용인 클래스 이니셜라이저에 대해 살펴보자 지정 이니셜라이저(Designated Initializer) 클래스의 주요 이니셜라이저 필요에 따라 부모 클래스의 이니셜라이저를 호출할 수 있으며, 이니셜라이저가 정의된 클래스의 모든 프로퍼티를 초기화해야 하는 임무를 갖고 있음 한 개 이상 정의해야 함 조상 클래스에서 지정 이니셜라이저가 자손 클래스의 지정 이니셜라이저 역할을 충분히 할 수 있다면, 자손 클래..

    [Swift] Property

    [Swift] Property

    저장 프로퍼티(Stored Property) 인스턴스의 변수 또는 상수를 의미 구조체와 클래스에서만 사용 가능 var, let 키워드 사용 지연 저장 프로퍼티(Lazy Stored Property) 호출이 있어야 값을 초기화하는 프로퍼티 lazy 키워드 사용 let 선언 불가: Constant property인 let은 인스턴스가 완전히 생성되기 전에 초기화해야 하므로 사용할 수 없음 property의 초깃값이 인스턴스의 초기화가 완료될 때까지 알 수 없는 외부 요인에 의존할 때 사용 property의 초깃값에 복잡하거나 계산 비용이 많이 드는 설정이 필요할 때 or 모든 저장 프로퍼티를 사용할 필요가 없을 때 사용 불필요한 성능 저하나 공간 낭비를 줄일 수 있음 주의※: 다중 스레드 환경에서 지연 저장..