Model 모델이란 데이터 타입을 의미한다. 보통 API 통신에서 대응하기 위해 자주 쓰는 느낌이 있지만 사실 Local에서도 올 수 있다는 걸 유념하자 API 쓰기 위해 파악할 것 API에서 보내는 데이터를 파악해야 한다. 이를 위해서는 API를 공개하고 있는 문서를 찾고, 해당 문서에서 스킴(Schem) 혹은 스키마(Schema)를 찾아라. 이를 이용하여 데이터 타입을 추론할 수 있고 Model을 만들 수 있다. 영상에서는 스키마를 복사 붙여넣기 하고 멀티라인 드래그를 통하여 프로퍼티를 만드는 방법으로 모델 struct를 제작했다. 하지만, 난 아프라즈와는 달리 QuickType이라는 사이트 추천하고 싶다. QuickType은 스키마나, API 결과로 나온 Json을 복사&붙여 넣기만으로 자동으로 원..
https://youtu.be/rL9Z2y3lvd4 Source Control with Github 기본적으로 xcode는 Source Control을 기반으로 작동한다. 예를 들어 코드 에디팅 화면에서 라인 번호 왼쪽에 푸른색 줄이 있을 것이다. 푸른색 줄을 클릭하면 discard 등의 행위를 할 수 있다. 나는 이미 Github과 연동해서 관리 중이었기 때문에 해당 부분은 다루지 않겠다. API Call GraphQL이나 REST 등의 api호출 방법이 존재하는데 강의에서는 REST만을 사용하여 구현한다. API 모듈 제작 APIClient 그룹에 이하의 파일들을 생성한다. RMService - API Call을 해주는 부분 RMRequest - resquest를 담당하는 부분 RMEndpoint -..
iOS Academy(아프라즈)의 강의를 보고 MVVM을 학습하는 기록. 노션에 적은 것을 가져와서 조금 다듬고 공개하는 거라서 간략하게 설명한 게 많다. 실제 프로젝트에서는 VC 같은 명칭을 쓰진 않았지만 여기서는 간단하게 VC로 약어로 표현한다. Setup과 기본적인 Group을 설정해준다. - Programmatically으로 UI를 구성하기 때문에 이를 위한 세팅을 진행해 준다. (Storyboard 삭제, targets info 수정 등..) MVVM 지금 9화까지 본 상황인데 MVVM 디자인 패턴을 정말 잘 알려주는 강의라 생각한다. 그룹은 다음과 같은 7개로 만들어진다. Controllers, Models, Views, ViewModels (+ APIClients, Managers, Reso..
Apple은 왜 개발자 UX는 생각 안 하지? Apple Document 왜 이렇게 하는지 잘 이해가 안 갈 때가 많다. 아래와 같이 조건문으로 처리하면 원하는 에러 코드를 번역해서 문자로 조회가 가능하다. let status = SecItemAdd(query as CFDictionary, nil) if status == errSecSuccess { print("Successfully added to keychain.") } else { if let error: String = SecCopyErrorMessageString(status, nil) as String? { print(error) } } ref https://stackoverflow.com/questions/34051482/secitemadd..
delegate는 대표, 위임자를 뜻하는 단어입니다. 델리게이트 패턴이란 하나의 객체가 모든 해야 할 일을 모두 정의하고 처리하는 것이 아니라 특정 행동에 대해서는 그것만을 전담하는 객체에게 일을 넘기는 것을 말합니다. 생산성 향상을 위해서 도입하는 패턴이라고 보시면 될 듯합니다. 상속만큼 강력한 재사용성을 보여주기도 하는 패턴으로 GUI 환경에서 많이 쓰입니다. 대표적으로 이벤트 리스너(Event Listener)에서 사용되고 있고 이미 우리는 이 패턴에 따라 생성된 함수들(onClick() 같은)을 호출해서 코드를 작성하고 있습니다. iOS 개발(UIKit)에서도 예외가 아닙니다. 그래서 어떻게 사용할까요? 1. 원하는 객체의 뒤에 Delegate를 붙여 프로토콜을 선언합니다. 때로는 이 단계에서 무..
참고 프로젝트 개요 - MVVM 구조 - SwiftUI -ToDO 리스트 프로젝트 UserDefaults에 데이터 저장 // ViewModel.swift class ListViewModel: ObservableObject { @Published var items: [ItemModel] = [] { //ItemModel은 두개의 String과 하나의 Bool로 구성되어 있습니다. didSet { //items 값이 변화하면 감지하면 saveItem 메소드를 실행합니다. saveItem() } } let itemsKey: String = "items_list" func saveItem() { if let encodedData = try? JSONEncoder().encode(items) { UserDefau..
문제 상황 스토리보드를 통해 구현한 CollectionView에 Cell이 존재하고 해당 Cell 안에 Label을 배치하여 좌측 상단부터 텍스트가 여러 줄로 출력되도록 처리하고 싶었다. 하지만 정상적으로 좌측 상단부터 우측 하단 방향으로 출력되지 않았고 셀의 범위를 초과하여 한 줄로 출력이 되는 상황이었다. 해결 1. Lines를 0으로 설정하기. 0으로 설정함으로서 줄의 최대 개수를 강제하지 않고 글자 수에 따라 유동적으로 줄 수가 정해진다. 2. Alignment를 왼쪽 정렬로 설정 3. Truncate Tail을 설정. 이 설정은 주어지는 문자열이 화면 범위를 초과하여 존재할 떄 말줄임표 "....."를 어떻게 표현할 것인지에 대한 설정이다. Tail 값으로 설정하면 "abcde...."의 형식으..
문제 상황 SwiftUI의 View Struct에서 이중 배열을 만들고 상황에 맞게 내부 배열에 append와 removeLast를 하려 했으나 "Thread 1: Fatal error: Index out of range" 에러가 발생했다. 이중 배열 안에서 첫번째 배열에는 정상적으로 데이터 입출력이 되는 상황이었고 두번째 배열에 접근하려고 하면 문제가 반복되는 상황이었다 해결 @State var Record: [[String]] = [[]] //