타입 검사 오퍼레이터 : is 해당 오퍼레이터를 사용해 인스턴스가 특정한 타입 또는 타입의 서브클래스 타입인지 확인 가능하다.클래스 타입의 프로퍼티는 사실 서브클래스 인스턴스를 가리키고 있을 수도 있다.이 때 타입 캐스팅 오퍼레이터 (as? 또는 as!)를 사용해 서브
타입의 저장 프로퍼티에 대한 초기값을 설정하고, 처음 한 번만 실행되는 설정 수행하기초기화(Initialization)는 클래스, 구조체, 열거형의 인스턴스를 사용하기 위해 준비하는 과정이다.초기자(initializer)를 정의해 초기화 과정을 구현한다.Swift 초기

초기화 과정에서 클래스가 상속받는 슈퍼클래스의 저장 프로퍼티들도 초기값을 설정해 주어야 한다.Swift는 클래스 타입이 모든 저장 프로퍼티가 초기값을 가지게 하기 위해 두 가지 초기자를 지원한다.지정 초기자 (Designated Initializers)편의 초기자 (C
배경 : 어떤 현상을 발견해서발단 : 이런 장애가 생길 수 있다는 것을 인지했고,전개 : 장애를 대응, 해결하던 와중에위기 : 또 다른 장애 발견 또는 간단하게 해결할 수 없다는 것을 알게되어서,절정 : 근본적인 해결을 위해 이런 방법으로 접근하였다.결말 : 따라서,
Initializer Inheritance and Overriding Objective-C와는 다르게, Swift 서브클래스들은 부모 클래스 초기자를 기본적으로 상속하고 있지 않다. 안전하고 적절한 특정한 상황에서만 부모 클래스 초기자들이 상속된다. 슈퍼클래스와 같
클래스의 모든 서브클래스가 해당 초기자를 구현해야 함을 나타내기 위해 require 모디파이어를 작성할 수 있다.또한 필수 초기자의 모든 서브클래스 구현에도 require 모디파이어를 작성해 그 아래 서브클래스에도 필수 초기자임을 알려주어야 한다. 필수 지정 초기자를
...
자신 및 부모 클래스의 모든 프로퍼티 기본값 설정하기인스턴스는 초기화 과정에서 모든 프로퍼티에 기본값을 할당해야 함.1단계 초기화는 부모 클래스 및 그를 상속하는 자식 클래스가 각자의 기본 프로퍼티를 설정하는 과정.자식 클래스의 경우 자기 자신의 프로퍼티에 기본값을 먼
인터페이스 분리 법칙에서의 인터페이스란 무엇일까?이는 Java 언어의 인터페이스를 뜻하고, Swift에서는 프로토콜이 그 역할을 수행하고 있다.따라서 인터페이스 분리 법칙이란, Swift에서는 프로토콜 분리 법칙이다.우리는 프로토콜을 사용해 객체의 프로퍼티 / 메소드를
API 통신 기능을 구현하던 중, 기능의 추상화는 어디까지 하는 것이 좋을까? 라는 의문이 들었다.오버엔지니어링과 언더엔지니어링 사이 적정 수준의 설계점을 어떻게 찾을 수 있을까?API 통신은 보통 아래와 같이 분리 및 추상화해 사용한다.Endpoint요청을 보낼 주소

아무 생각 없이 프로토콜을 작성하다가... associatedtype을 사용한 프로토콜을 타입으로 사용할 땐 any를 붙여줘야 한다는 warning을 보게 되었다.associatedtype을 사용하지 않은 프로토콜은 any를 붙여주지 않아도 아래와 같이 타입으로 선언

큐 자료구조를 사용할 일이 있어서 제네릭하게 만들던 도중, dequeue 기능을 아래와 같이 구현하였다.그런데 첫번째 인덱스를 삭제하는 것은 배열을 shift하기 때문에 O(n)의 시간복잡도를 가지지 않을까 생각했다.함수 정의의 주석을 살펴보니 예상대로 O(n)의 시간
스터디 도중 구조체가 클래스에 비해 가지는 가장 두드러지는 강점은 무엇일까? 라는 이야기가 나왔다.즉, 클래스와 구조체 중 구조체를 선택한다면, 그 주요 이유는 무엇일까?WWDC16 - Understanding Swift Performance 비디오를 모두 시청하고 모

배경 : 어떤 현상을 발견해서발단 : 이런 장애가 생길 수 있다는 것을 인지했고,전개 : 장애를 대응, 해결하던 와중에위기 : 또 다른 장애 발견 또는 간단하게 해결할 수 없다는 것을 알게되어서,절정 : 근본적인 해결을 위해 이런 방법으로 접근하였다.결말 : 따라서,
오늘 내배캠에서 현호 튜터님의 마인드셋 강의를 듣게 되었다. 해당 강의에서 공감을 느끼는 부분이 많고, 내가 변해야겠다는 부분을 많이 느껴 TIL을 작성하게 되었다. 성장 마인드셋과 고정 마인드셋 고정 마인드셋은, 무언가 나보다 뛰어나고 능력있는 사람을 보았을 때,
escaping closure를 자주 사용하고 접하면서도, 정확히 어떤 상태일 때 escaping으로 동작하는지 잘 몰랐던 것 같아 정리하게 되었다.클로저가 함수의 매개변수로 전달되었지만, 함수 반환 이후(함수의 생명주기 외부에서)에 호출되는 경우 escape(탈출)한

클로저의 갑 캡처 그리고 캡처 리스트의 동작 방식을 이해해보자클로저는 클로저가 정의된 주변 컨텍스트에서 상수와 변수를 캡처할 수 있다.클로저는 해당 상수와 변수가 정의된 원본 스코프가 더 이상 존재하지 않을지라도, 클로저 본문 내에서 캡처한 값을 참조하고 변경할 수 있

클로저의 값 캡처 예시로 아래와 같은 예제를 다뤘다.문제는 named closure인 incrementer에는 문법적으로 캡처 리스트를 활용할 수 없다는 것이다. 캡처 리스트를 활용해 독립적인 값의 복사본을 가지고 싶다면 아래와 같이 코드를 수정할 수 있다.다만 이 코
@inlinable이 대충 컴파일 타임 최적화를 위한 어트리뷰트임은 알고 있었지만, 정확하게 무슨 일을 하는지 모르고 있다.이를 알기 위해 공식문서를 통해 학습하였다.inlinable을 다루기 전에 먼저 attribute가 무엇인지 정확히 짚고 넘어가자.Swift에서
컴파일 타임 최적화 기술인 WMO에 관해 조금 잘못 알고 있었던 점이 있어 기록하기로 했다.Swift 파일의 묶음인 모듈을 컴파일 하면... 각 파일이 개별로 컴파일되어 오브젝트 파일(.o)을 만들고, 링커가 각 오브젝트 파일을 합쳐 실행 가능한 바이너리 파일을 생성한
임성수님의 코어데이터 강의를 들으면서 delete rule에 관해 더 깊이 이해할 수 있는 기회가 생겼다.Relation 삭제 시 발생하는 작업을 정의하는 delete rule은 NSDeleteRule 이라는 열거형으로 정의되어있다.각각의 규칙을 살펴보자.참조된 man
공공데이터 API를 통해 제공되는 JSON 또는 CSV 파일을 프로젝트에 사용할 더미 JSON 파일로 변환할 필요가 있었다.이 때 효율적으로 GPT를 활용하는 방법을 알아보자!첫 번째 방법은 csv, json 등 raw 데이터를 긁어넣고 그에 대한 데이터를 출력해달라고
알고리즘 문제를 풀던 도중 하나의 테스트 케이스만 실패하는데, 도무지 해당 테스트 케이스가 무엇인지 모르겠는 상황이 있었다.프로그래머스 - 단어 변환 문제를 풀고 최종 제출 하였는데, 테스트케이스 3번이 계속 실패했다.어디가 문제일까 고민하며 BFS 알고리즘만 고민하고

코어데이터 과연 어떻게 쓰는 녀석인가? 조금 더 잘 알기 위해 공부해 보았다.코어 데이터 스택이란 코어 데이터가 데이터를 관리하고 저장하는 데 필요한 모든 구성 요소를 의미한다.Model(NSManagedObjectModel)이 Entity, 즉 모델을 표현하는 객체N

배경 RxSwift 지식을 공부해 보았다.

탈출 클로저에서 참조 타입 self에 접근할 땐 순환 참조 방지를 위해 weak self를 사용하라고 배운다.그런데 값 타입 self에 접근할 땐 어떤 일이 일어날까?아래 코드로 값 타입 self를 탈출 클로저 내부에서 캡처해 보았다.non-mutating 함수 내부에

입력 소스를 관리하는 객체들에 대한 programmatic 인터페이스RunLoop 객체는 마우스와 키보드 이벤트 등의 소스들로부터의 입력을 처리한다. RunLoop 객체는 Timer 이벤트를 처리하기도 함RunLoop는 앱이 명시적으로 생성 및 관리하지는 않음.시스템이
메타타입 타입은 클래스 타입, 구조체 타입, 열거형 타입, 프로토콜 타입 등 모든 타입의 타입을 의미.클래스, 구조체, 열거형의 메타타입은 해당 타입의 이름 뒤에 .Type이 붙는다.프로토콜 타입의 메타타입은 해당 프로토콜의 이름 뒤에 .Protocol이 붙는다.ex)
RxSwift를 의존하며, BehaviorSubject, PublishSubject, RelaySubject에 대한 간단한 래퍼를 제공하는 모듈이다.일반적인 Subject는 onError, onCompletion 시 시퀀스가 종료된다.Relay는 절대로 종료되지 않는
값이 아닌 프로퍼티에 대한 참조.어떤 타입의 프로퍼티에 대한 경로를 표현하는 것.프로퍼티의 값에 대한 접근은 아래와 같이 가능KeyPath는 프로퍼티에 대한 경로를 표현하는 객체이다.아래와 같이 사용 가능하다.key-path 표현식은 컴파일 타임에 KeyPath 클래스

해당 클래스는 보통 그대로 사용되지만, 서브클래스될 수도 있다.탭바 컨트롤러 인터페이스의 각 탭은 커스텀 뷰컨과 연관되어 있다.유저가 특정한 탭을 선택하면 탭바 컨트롤러는 대응하는 뷰컨의 루트뷰를 표시한다.사용자 탭은 항상 탭의 루트 뷰를 표시한다. 탭바 컨트롤러의

해당 클래스는 보통 그대로 사용되지만, 서브클래스될 수도 있다.탭바 컨트롤러 인터페이스의 각 탭은 커스텀 뷰컨과 연관되어 있다.유저가 특정한 탭을 선택하면 탭바 컨트롤러는 대응하는 뷰컨의 루트뷰를 표시한다. \- 사용자 탭은 항상 탭의 루트 뷰를 표시한다. 탭바 컨

CALayer, CGColor 등 로우레벨 클래스는 다이나믹 컬러를 이해하지 못함.다이나믹 컬러는 UIKit 컨셉임따라서 이 경우엔 어떻게 처리해야 할까?모드 변경되면 setNeedsLayout 호출된다. 따라서 전체 레이아웃이 다시 수행됨.이는 뷰컨과 presenta

공식문서(https://developer.apple.com/documentation/usernotifications앱이 inactive한 상태면 알람을 어떻게 재생할까?notification을 통해 알람 표시 / 소리 재생이 가능하다.앱에서 로컬하게, 또는 서
진동과 소리로 알람 재생알람 멈춤디바이스에서 소리를 재생하는 방법디바이스에서 진동을 재생하는 방법디바이스가 잠겨있는 상태에서 소리와 진동을 재생하는 방법디바이스가 매너 모드일 경우에 소리를 재생하는 방법먼저 애플 공식문서에서 audio로 검색되는 프레임워크들 검색Med
코디네이터는 이 블로그에서 처음 제안된 개념뷰컨이 커지는 문제의 원인 중 하나는 뷰 로직, 비즈니스 로직, 플로우 로직을 모두 담고 있기 때문이라고 지적간단한 앱에서는 뷰컨 내부에서 새로운 뷰컨을 생성하고 present하는 로직이 문제 없음.그러나 앱이 커질수록 뷰컨

Inversion of Control Container, 또는 DI Container의 모던한 개념은 마틴 파울러가 시작.그러나 그 이전에도 Inversion of Control Container라는 용어는 쓰이고 있었다.마틴 파울러 블로그를 참고해 어떤 개념인지 살펴

swift 코드 reformat을 위한 도구코드 컨벤션 맞추기 작업을 컴파일 타임 이전에 자동으로 수행한다.협업 과정에서 컨벤션 맞추기에 코드 리뷰 시간을 할애하지 않고, 한 사람이 쓴 듯한 일관성 있는 코드로 가독성을 높이기 위해 적용.적용 과정에서 어떤 규칙을 적용