Hash
Swift에서 해시(Hash)의 개념과 사용 예제 1. 해시(Hash)란? 해시(Hash)는 데이터를 해시 함수(Hash Function)를 사용하여 고유한 숫자로 변환한 후, 해당 숫자를 기준으로 값을 저장하고 검색하는 방식이다. Swift에서는 Set과 Dictionary가 내부적으로 해시 테이블(Hash Table)을 사용하여 데이터를 ...
Swift에서 해시(Hash)의 개념과 사용 예제 1. 해시(Hash)란? 해시(Hash)는 데이터를 해시 함수(Hash Function)를 사용하여 고유한 숫자로 변환한 후, 해당 숫자를 기준으로 값을 저장하고 검색하는 방식이다. Swift에서는 Set과 Dictionary가 내부적으로 해시 테이블(Hash Table)을 사용하여 데이터를 ...
UIScrollView의 내부 함수로써 뷰를 밑으로 당기는 동작을 했을때 나타나는 로딩 인디케이터 (:loading:) 내부 코드 @MainActor open class UIRefreshControl : UIControl { public init() open var isRefreshing: Bool { get } open...
작업을 비동기적으로 실행할 수 있는 GCD(Grand Central Dispatch) 큐. 멀티쓰레딩이 가능하도록 도와줌. DispatchQueue의 역할 비동기적으로 실행하게 하여 UI가 멈추지 않도록 한다. 백그라운드에서 실행하여 CPU 리소스를 최적화 해준다. 우선순위(QOS)를 설정하여 중요한 작업을 빠르게 처리한다. 1....
MVVM 아키텍처란? iOS 개발자가 알아야 할 구조와 실제 적용법 MVVM이란? MVVM은 Model-View-ViewModel의 약자로, 뷰 로직과 비즈니스 로직을 분리하는 아키텍처 패턴이다. Model: 서버 응답 구조나 도메인 객체를 정의하고, 일부 비즈니스 로직 포함할 떄도 있음 ViewModel: 모델을...
아래는 Swift의 클로저 값 캡처, 메모리 누수 디버깅, 그리고 SwiftUI에서의 클로저 캡처까지 모두 포함한 실전 중심의 정리다. 복붙 가능한 마크다운 형식이다. Swift 클로저의 값 캡처(Value Capture)와 메모리 누수, SwiftUI에서의 캡처 정리 1. 값 캡처란? Swift에서 클로저는 정의 당시 주변 변수의 값을 캡처...
Modifier의 기본 구조 SwiftUI의 Modifier는 View에 스타일이나 동작을 연속해서 적용할 수 있도록 구성되어 있다. 내부적으로는 메서드 체이닝 구조이며, self를 반환하기 때문에 다음 Modifier를 계속 이어 붙일 수 있다. Text("Hello") .font(.title) .foregroundColor(.re...
PublishSubject란 이벤트가 발생하면 데이터를 구독자들에게 전달하는 역할이다 .onNext(())가 호출될때마다 구독자에게 데이터가 전달된다.(이벤트가 방출된다.) let buttonClickPublishSubject = PublishSubject<Void>() // ✅ 이벤트가 방출되면 구독자가 반응함 button...
Dispose는 Observable과 구독간의 연결을 끊는 역할을 한다. 예제 코드 (개별 dispose) let observable = Observable.of("A", "B", "C") let disposable = observable.subscribe { event in print(event) } // ✅ 수동으로 구독 해제...
비동기 흐름을 다루는 핵심 개념, Observable이란? 앱 개발을 하다 보면 버튼 클릭, 네트워크 응답, 텍스트 필드 변경 등 다양한 비동기 이벤트를 다뤄야 한다. 이럴 때 단순한 콜백 방식은 코드 흐름을 이해하기 어렵게 만들 수 있다. 이를 해결하기 위해 등장한 개념이 바로 Observable이다. Observable은 무엇인가? Obser...
UIKit에서 버튼, 제스처, 타이머 등의 이벤트가 발생했을때 특정 메서드를 실행하는 방식이다. 주로 UIButton, UIControl, UITapGestureRecognizer 같은 UI 요소에서 사용된다. 🚧 기본 구조 button.addTarget(self, action: #selector(methodName(_:)), for: .touc...