iOS 12

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사용자의 마지막 위치를 가져..

iOS
[iOS] 오토레이아웃 근데 이제 Priority를 곁들인

오토레이아웃이란뷰 계층 구조에 있는 모든 뷰의 크기와 위치를해당 뷰에 적용된 제약 조건(constraints)에 따라 동적으로 계산하는 것을 말한다! 이때, 제약조건이란자기 자신을 다른 객체로부터 상대적으로 나타내는 것이다. ex. 아래에서이미지뷰를 레이블을 기준으로 20 아래에 놓거나스크린의 정 가운데에 놓는 등다른 객체를 기준으로 자신의 위치 혹은 크기를 정하는 것!! 이러한 오토레이아웃을 사용하는 이유는?! 애플의 여러 기기 사이즈가 다 다른데frame방식으로 객체를 잡으면,기기마다 다 다르게 나올 것.... iphone 16기준으로 뷰의 크기와 위치를 잡으면iphone8에서는 잘려서 보이거나iphone 16promax에서는 너무 작게 나올 수 있다는 말이다. 그래서!모든 기기에서 뷰객체를 똑같은 ..

iOS
[UIKit] 코드로 화면 전환 (present-dismiss, pop-push)

스토리보드에서 세그웨이를 연결하면 쉽게 화면 전환할 수 있는데, 왜 코드로 설정해요?!라고 한다면,같은 버튼을 클릭했을 때, 다양한 경우의 수가 존재할 수 있는데, 이는 스토리보드에서 대응할 수 없기 때문에코드를 통해 세부적 대응을 해야 한다! 화면을 전환하는 modal과 show 두 가지 방식에 대해서 알아보겠습니닷 Modal 방식 Modal 방식이란, 화면이 아래에서 위로 올라오는 방식입니다Present를 통해 화면을 올리고, Dismiss를 통해 화면을 내립니다! 단계 1) 전환할 화면을 만든다저는 스토리보드로 뷰를 만들고, viewcontroller 코드를 생성했습니다.+ identity inspector영역에서 뷰와 코드를 연결해 줬습니다. 단계 2) 전환할 화면의 storyboardID Ide..