일반적으로 더이상 상속되지 않을 class 앞에 `final`이라는 키워드를 붙이곤 한다.그렇게 하면 이 class는 더이상 상속되지 않을걸 알기에, 시스템의 입장에서 재정의를 위한 일련의 과정을 수행하지 않아도 되기 때문에 성능상에 이점이 있다고 알고 있었다. 그런데, 위의 문장으로는 뭔가 설명이 조금 부족해보인다.이번 글에서는 WMO와 Method Dispatch에 대한 설명과 함께 `final`을 붙이는 진짜 이유에 대해 알아보도록 하겠다.WMO: 전체 모듈 최적화xcode에 여러 개의 swift파일이 존재할 때 빌드를 하면, Swift는 각 파일을 개별적으로 컴파일한다.그런데 사실상 각각의 파일이 개별적으로 존재하는 경우는 잘 없다. 그러니까, 각 파일은 내부적으로 서로 연관이 있는 경우가 일반적..
동기와 비동기, 동시와 직렬은 Swift 공부를 하면서 한번쯤은 들어봤을 개념일 것이다.이번 글에서는 개념에 대해서는 간단하게만 짚고 넘어가고,다양한 상황에서 동기/비동기 그리고 동시/직렬처리를 했을때 출력 결과가 어떻게 나올지 예측하고, 정답여부를 체크해보겠다. 동기와 비동기 vs 동시와 직렬동기 VS 비동기동기와 비동기는 메인 쓰레드 관점에서의 구분이라고 생각하면 된다.- 동기(Sync): 여러 Task가 있을 때, 몇 개의 Task가 Queue로 보내졌다면, 메인쓰레드 입장에서 Queue로 보내진 Task가 끝날때까지 기다렸다가 다음 Task를 하는것.- 비동기(Async): Queue로 보내진 Task가 끝났는지의 여부와 상관없이, 바로 다음 Task를 진행하는 것동시 VS 직렬동시와 직렬은 Qu..
UIKit에서 커스텀뷰를 만들어서 작업하는 도중에, 반복작업을 더 줄이기 위해 `addTarget()` 메서드도 커스텀뷰 안에 만들고 싶어졌다.그런데 예상한것과 다르게 제대로 동작하지 않았고, 그 이유가 궁금해져서 찾아본 결과를 정리해보도록 하겠다.UIKit의 커스텀뷰UIKit에서 반복되는 뷰를 편리하게 관리하기 위해 커스텀뷰를 만들곤 한다.예를 들어 다음과 같은 화면이 있다고 하면 각 버튼의 UI를 하나씩 전부 구성하는게 아니라, 하나의 커스텀뷰를 만들어서 일부분만 변경하여 사용할 수 있다. UIButton을 상속하는 커스텀버튼 클래스를 만들고, 버튼을 생성할때 UIButton이 아닌, 방금 만든 커스텀버튼을 타입으로 지정해주면 된다.// 커스텀버튼 클래스class SortButton: UIButton..
HTTP 프로토콜을 이용해 서버와 통신하는 경우, 클라이언트쪽에서는 서버에서 받은 데이터를 가공해서 사용해야 한다.이 과정을 디코딩이라고 하는데, 보통 Swift에서 데이터를 받는 그릇으로 struct로 만드는 편이다.그러니까, 서버에서 String형태로 오는 데이터를 struct에 담아 가공해서 데이터를 사용하는 방식이라고 생각하면 된다. 그러다보니 이런 궁금증이 생겼다."왜 class가 아닌 struct로 받는거지?" 이번 글에서는 iOS의 네트워크통신과, struct/class의 차이점을 알아보겠다.iOS의 네트워크통신클라이언트가 서버에게 "이런 데이터 가져다줘!"라고하고, 서버가 해당 데이터를 응답으로 주는걸 보통 "네트워크 통신을 한다"고한다.이러한 정보 요청에 대한 기준을 API라고 하며, 그..
Swift로 개발을 하다보면 Any라는 타입을 만나게 된다.예를 들어 어떤 배열의 타입이 Any라면 그 타입에는 어떤 타입이든 들어올 수 있다는걸 뜻한다. 이 글에서는 Any타입의 특징과, 이와 비슷해보이는 AnyObject에대해 알아보도록 하겠다.Any타입의 특징Any타입을 담을 수 있는 배열에는 모든 타입이 들어올 수 있다.var somethings: [Any] = []somethings.append(true)somethings.append(iPhone) // 직접 만든 클래스의 인스턴스somethings.append("something")개발자문서에 따르면 Any타입에 포함될 수 있는 타입은우리가 알고있는 Int, String, Bool타입 등 기본 타입 뿐 아니라 튜플, 클로저 또는 함수타입까지 ..
FullScreenModal 등으로 화면이 꽉 찬 상태에서 이전 뷰로 돌아가고 싶을 때 다양한 방법이 있을 수 있다.만약 present로 모달이 올라오게 코드로 작성한 상황에서는 dismiss기능으로 모달을 닫을 수도 있다.반면 unwind segue라는 특이한 기능도 있는데, 이는 보통 스토리보드로 개발할때 주로 사용하며, 특정한 화면으로 돌아가고 싶을 때 사용 하는 기술이다.unwind segue를 왜 사용하나요?공식문서를 참고해보면, 뷰컨트롤러를 dismiss할때 사용하는 기능인 unwind segue는 런타임에 해당 세그웨이의 대상을 결정하므로 뷰 컨트롤러 계층을 설정하는 방법에 제한이 없다.예를 들어 다음과 같이 두 개의 VC가 동일한 자식 VC를 표시하는 상황이 있을 때, 다음에 표시할 VC를..