전체 글 25

iOS
SwiftUI 프로퍼티 래퍼 총정리 (@State, @Binding, @StateObject, @ObservedObject 등 ...)

안녕하세요, 오늘은 SwiftUI에서 사용하는 프로퍼티 래퍼의 종류와 동작 원리에 대해 알아보겠습니다 :) #0 들어가기 앞서..SwiftUI에서 상태 관리는 뷰의 렌더링과 직접적으로 연결되어 있고 이는 앱의 성능과도 연결되어있습니다.상태관리를 잘못하여 뷰가 계속해서 렌더링이 된다면, 성능 저하 및 메모리 낭비 등으로 이어질 수 있습니다.따라서, SwiftUI에서 사용하는 다양한 속성 래퍼가 어떤식으로 구현(+동작)되어 있고 사용할 때 주의할 점이 있는지 살펴보겠습니다! #1 상태란 무엇인가?SwiftUI에서 상태란, UI를 구성하는 데이터의 현재 값을 의미합니다.이러한 상태가 변경되면 SwiftUI에서 자동으로 body를 업데이트합니다. (body 내부에서 변경된 곳만 인식하여 자동으로 업데이트 하도록..

iOS
[Swift] Property Wrapper: 속성 래퍼

#1 Property Wrapper Property Wrapper는 로직을 캡슐화하여 재사용할 수 있게 만드는 Swift 문법입니다.→ 속성에 부가 기능(로직)을 추가한 문법. ex. 예를 들어, UserDefaults에 값을 저장하고 불러오는 로직을 생각해봅시다.보통, Key를 통해 UserDefaults에 저장하고 불러옵니다.// 읽기UserDefaults.standard.object(forKey: key)// 수정UserDefaults.standard.set(newValue, forKey: key)이러한 로직을 재사용할 수 있도록 만들어 보겠습니다. 1) Property Wrapper를 사용하지 않았을 때struct Settings { private let key = "isDarkMode" ..

iOS
[iOS] DTO, Entity의 분리

안녕하세요, 오늘은 DTO, Entity, ViewModel에 대해 알아보겠습니다. DTO란?DTO란, Data Transfer Object의 약자로 직역하면 "데이터 전송 객체"입니다.말 그대로 데이터를 다른 곳으로 전달하기 위해 사용하는 바구니 같은 존재입니다. 어떤 경우가 있을까요? 서버에서 데이터를 받아오는 상황을 생각해봅시다!만약, 서버에서 아래와 같은 json타입을 반환한다고 하면,{ "user_id": 1, "user_name": "vicky", "reg_date": "2025-03-17"} 앱에서도 서버에서 반환하는 데이터 형식과 공통된 형식의 객체가 필요합니다!따라서, 아래처럼 Codable 프로토콜을 채택하는 객체를 생성하여 디코딩에 사용할 것입니다.struct User..

iOS
[UIKit] UIViewController에서 제네릭으로 UI 분리하기

안녕하세요, 오늘은 UIViewController에서 UI에 해당하는 코드를 다른 파일로 분리하고구성을 재사용할 수 있도록 Base 템플릿을 구성해보겠습니다! #0 들어가며혹시 뷰컨트롤러를 생성할 때, UIView와 UIViewController 를 상속받는 두 파일을 만들어서뷰컨트롤러에서 뷰를 loadView에서 갈아끼워주는 작업을 하신 적 있으신가요?class CustomView: UIView {}class CustomViewController: UIViewController { var mainView = CustomView() func loadView() { view = mainView }} 저는 이렇게 UI를 담당하는 뷰와 로직을 처리하는 뷰컨트롤러로 나누어서..

iOS
[UIKit] CollectionView에서 선택한 셀 다시 클릭하면 해제하는 법

안녕하세요, 오늘은 컬렉션뷰의 셀 선택 해제 구현 방법에 대해 알아보겠습니다 :) 제가 구현하고자 하는 것은1. 컬렉션뷰에서 셀은 하나만 선택 가능하다.2. 선택된 셀을 다시 재선택 하면 셀 선택이 해제되어야 한다.입니다.컬렉션뷰의 경우allowsMultipleSelection을 따로 설정하지 않으면, 디폴트로 단일 선택만 가능합니다. 구현 아이디어해당 기능을 어떻게 구현할 까 생각해 보았을 때,아래처럼 두 가지 방법이 떠올랐습니다.방법 1:1. allowsMultipleSelection 설정X → 셀 단일 선택만 가능.2. 셀을 선택할 경우,     → (셀이 select되기 전에) 이미 선택된 셀인지 확인하고 → 선택된 셀 O → deselect                               ..

iOS
[UIKit] CLLocationManager를 통해 사용자 위치 정보 다루기

UIKit에서 사용자의 현재 위치 정보를 가져올 수 있는 CLLocationManager 사용법에 대해 알아보겠습니다! 1. 위치 매니저 생성먼저, 위치 관련 작업의 대부분을 담당하는 CLLocationManager 인스턴스를 생성합니다.let locationManager = CLLocationManager()이 인스턴스를 통해 위치 업데이트, 권한 요청 등의 작업을 수행할 수 있습니다. 2.  CLLocationManagerDelegate 프로토콜 채택 및 구현위치 업데이트 및 권한 상태 변경 등의 이벤트를 처리하기 위해 CLLocationManagerDelegate 프로토콜을 채택해야 합니다.[사용자의 위치를 성공적으로 가지고 온 경우] → didUpdateLocations사용자의 마지막 위치를 가져..

트러블슈팅
[UIKit] Cell에서 버튼의 액션이 작동하지 않은 이유

문제테이블뷰셀이나 컬렉션뷰셀 내부의 버튼 액션이 동작하지 않는 버그가 발생했습니다.셀 UI는 잘 보이는데,, 왜 버튼의 액션이 동작하지 않는지 원인을 찾아보겠습니다!!원인 분석 View Hierarchy를 통해 확인한 결과, 셀에 추가한 뷰 위에 contentView가 덮어씌워져 있는 것을 확인하였습니다.애플 공식 문서에 따르면, addSubview는 부모 뷰의 하위 뷰 목록의 끝에 뷰를 추가하는 메서드입니다.따라서, 셀에 객체를 추가할 때,contentView.addSubView(~~)가 아닌contentView를 생략하고 addSubView(~~)로 객체를 추가하였기 때문에,  cell 자체의 하위뷰로 추가되어 버튼의 액션이 contentView에 가려져 해당 문제가 발생함을 알게되었습니다.(cont..

swift
[swift] 동시성 프로그래밍

GCD(Grand Central Dispatch)란?애플에서 멀티 쓰레드를 지원하기 위해 개발한 것으로 그 종류에는 DispatchQueue와 OperationQueue가 있다.(보통 DispatchQueue를 GCD라고 칭한다)DispatchQueue의 종류1. global2. main3. customSerial vs ConcurrentSerial(직렬): 큐에 들어온 작업을 하나의 쓰레드에서만 처리하도록 함.Concurrent(동시): 큐에 들어온 작업을 여러 쓰레드에 분산하여 처리하도록 함. → serial은 혼자! concurrent는 여러명!Serial(직렬)은 DispatchQueue.mainConcurrent(동시)는 DispatchQueue.global()으로 실행. ※ 직렬에서 Dispa..