Today I Learn 15

Swift - NSCache + Actor 기반 이미지 캐시 매니저 구현기(2)

이전 포스팅에서 프로젝트에서 이미지 캐시를 적용한 이유와NSCache + Actor 기반으로 Kingfisher 같은 라이브러리 없이간단한 이미지 캐싱 매니저를 구현하는 과정을 소개했었다 2025.04.11 - [Today I Learn] - Swift - NSCache + Actor 기반 이미지 캐시 매니저 구현기(1) Swift - NSCache + Actor 기반 이미지 캐시 매니저 구현기(1)버거킹 앱을 클론 코딩한 iOS 사이드 프로젝트에서 이미지 캐시를 적용한 이유와 구체적인 적용 방법에 대해 공유하려고 한다 캐시가 왜 필요했을까? 아래는 프로젝트의 메인 화면이다 해당soo-hyn.tistory.com 이번 글에서는 캐시 데이터의 만료 정책과 디스크 사용량 관리에 대해 소개해보려고 한다캐시란?..

Today I Learn 2025.04.11

Swift - NSCache + Actor 기반 이미지 캐시 매니저 구현기(1)

버거킹 앱을 클론 코딩한 iOS 사이드 프로젝트에서 이미지 캐시를 적용한 이유와 구체적인 적용 방법에 대해 공유하려고 한다 캐시가 왜 필요했을까? 아래는 프로젝트의 메인 화면이다 해당 화면은 Category, MenuItem, Cart 섹션으로 구성되어 있으며 사용자가 카테고리를 선택할 때마다 서버로부터 해당 카테고리의 메뉴 데이터를 받아오는 구조이다 예를들어,처음에 ‘단품’ 카테고리가 선택되어 ‘단품 메뉴 아이템’을 서버로부터 받아오고이후, ‘세트’ 카테고리를 선택하여 ‘세트 메뉴 아이템’을 받아오며다시 ‘단품’ 을 선택하면 또다시 서버에 ‘단품 메뉴 아이템’을 요청하게 된다하지만 메뉴 아이템 데이터는 실시간으로 자주 변경되는 정보가 아니기 때문에 매번 서버에 요청할 필요는 없다즉, 처음 데이터를 받아..

Today I Learn 2025.04.11

RxSwift에서 observe(on:)으로도 UI 업데이트가 즉시 반영되지 않는 이유와 해결법

문제상황ViewController에서 컬렉션뷰의 내부 inset을 변경하기 위해(UI 업데이트)observe(on: MainScheduler.instance) 를 사용했지만 바로 업데이트가 되지 않는 문제가 발생헀다 // 컬렉션뷰의 bounds와 책 개수에 따라 컬렉션뷰의 셀 인셋 설정 private func bindCollectionViewInsets() { Observable.combineLatest( books.map { $0.count }, // 현재 책 개수 homeView.topView.seriesNumberCollectionView.rx.observe(CGRect.self, "bounds") // 뷰 크기 변화 감지 (옵셔널 타입..

Today I Learn 2025.04.01

Swift - 날짜 설정 DateFormmater VS Date.FormatStyle

'1998-07-02' 형태의 Json 데이터(String)를 변형하여 'June 26, 1997'(String) 형태로 표시하려고 한다1. DateFormmaterDateFormatter는 Foundation에서 제공하는 클래스로 날짜를 문자열로 변환하거나 반대로 변환하는 기능을 한다String 값을 dateFormmater를 이용하여 Date 타입으로 변환Date 타입의 dateStyle, locale을 설정하여 Date → String 타입으로 변환 init(from decoder: any Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // '1998-07..

Today I Learn 2025.03.27

Today I Learn - 배열의 짝수 번째 요소를 제거하는 다양한 방법

문제 )[ ] Int 배열의 짝수번째 요소를 제거해서 반환하는 함수 a 를 작성해주세요.테스트 입력: [1, 2, 3, 4, 5]테스트 출력: [1, 3, 5] 배열을 입력 받아 짝수번째 요소를 제거하고 남은 요소를 반환하는 함수를 작성하는 간단한 문제이다 내가 작성한 코드보다 코드리뷰를 통해 확인한 다른 팀원분들의 방법이 더 효과적이고 해당 코드를 통해 새롭게 알게된 프로퍼티를 소개하려고 한다   아래는 내가 해결한 방식이다 1. enumerated()를 사용하여 (offset, element) 튜플 생성2. filter를 이용하여 짝수 번째 요소를 제거3. map을 사용하여 (offset, element) 튜플 중 element만 반환 enumerated() + filter + map // In..

Today I Learn 2025.03.20

Today I Learn: @escaping 클로저

Swift에서 클로저(Closure)는 기본적으로 함수의 실행이 끝날 때 자동으로 해제되는 특징을 가짐하지만 특정 상황에서는 클로저가 함수가 끝난 후에도 유지되어야 하는 경우가 있음이때 사용하는 것이 @escaping 키워드→ 클로저의 생존 기간을 함수 밖으로 연장하는 것1. @escaping이 필요한 이유기본적으로 Swift의 클로저는 비탈출(Non-Escaping) 방식이다.→ 기본적으로 클로저는 함수가 종료되면 메모리에서 자동으로 해제됨하지만 비동기 작업(Async Task)의 경우 클로저가 함수의 실행이 끝난 후에도 유지되어야 함 예제: 네트워크 요청 (비동기 실행)func fetchData(completion: @escaping (String) -> Void) { DispatchQueue...

Today I Learn 2025.03.14

Today I Learn: Swift에서의 Copy On Write (COW)

Copy On Write (COW)공유 데이터를 효율적으로 관리하기 위해 프로그래밍에 사용되는 리소스 관리 기술여러 프로그램에서 데이터를 사용할 때 바로 복사하는 것이 아니라, 수정을 시도할 때까지 동일한 데이터를 프로그램 간에 공유함변경사항이 없으면 개인 복사본이 생성되지 않아 리소스가 절약됨복사본은 필요한 경우에만 만들어지므로 수정이 발생할 때 각 프로그램이 자체 버전을 갖게 됨 Swift에서의 COW값 타입을 효율적으로 관리하기 위한 최적화 기법값을 변경하기 전까지는 복사하지 않고, 변경이 발생하면 실제로 복사하는 방식으로 동작함 COW가 적용되는 타입Swift에서는 Array, Dictionary, Set, String 같은 컽렉션 타입은 Copy On Write에 최적화가 적용되어 있음즉, 컬렉..

Today I Learn 2025.03.12

Today I Learn: Swift에서의 연결 리스트

연결 리스트(Linked List)는 노드(Node)라는 개별 요소들이 연결되어 있는 자료 구조이다 Swift는 기본 라이브러리로 Linked List가 포함되지 않으므로 직접 구현해야 한다 1. 연결 리스트(Linked List)의 기본 개념연결 리스트는 여러 개의 노드로 이루어져 있으며, 각 노드는 데이터와 다음 노드를 가리키는 포인터(참조)를 포함한다단일 연결 리스트(Singly Linked List)각 노드는 데이터와 다음 노드를 가리키는 참조(next)만 포함이중 연결 리스트(Doubly Linked List)각 노드는 데이터, 이전 노드를 가리키는 previous 참조, 다음 노드를 가리키는 next 참조를 포함원형 연결 리스트(Circular Linked List)마지막 노드의 next가 첫..

Today I Learn 2025.03.11

Today I Learn - 숫자 야구 게임(Set VS Array)

Swift 문법을 응용해서 숫자 야구 게임을 만들어봅니다!숫자 야구 게임은 두 명이 즐길 수 있는 추리 게임으로, 상대방이 설정한 3자리의 숫자를 맞히는 것이 목표입니다. 각 자리의 숫자와 위치가 모두 맞으면 '스트라이크', 숫자만 맞고 위치가 다르면 '볼'로 판정됩니다. 예를 들어, 상대방의 숫자가 123일 때 132를 추리하면 1스트라이크 2볼이 됩니다. 이러한 힌트를 활용하여 상대방의 숫자를 추리해 나가는 게임입니다. Lv1. 정답이 될 수 있는 숫자의 조건정답은 랜덤으로 만듭니다.(1에서 9까지의 서로 다른 임의의 수 3자리) // 정답 숫자 랜덤 생성 func createAnswer() -> [String] { var numSet: Set = [] // Set은 중복 허용..

Today I Learn 2025.03.10

Today I Learn: UIAlertController에 TextField 추가 및 데이터 사용

오늘은 Alert에 TextField를 추가하는 방법을 알아보려고 한다.생각보다 아주 간단하다Alert에 TextField를 추가하기 전 Alert을 생성하는 방법에 대해 알아보자  https://developer.apple.com/documentation/uikit/uialertcontroller UIAlertController | Apple Developer DocumentationAn object that displays an alert message.developer.apple.com 우리가 아는 알림을 띄우는 컨트롤러이다  Alert 생성하기가장 기본적인 확인 버튼, 취소 버튼으로 구성된 Alert을 생성해보겠다 @objc private func createAlert() { l..

Today I Learn 2025.03.07