에러 핸들링은 정말 중요합니다. 단순히 라이브러리에서 발생하는 에러를 처리하는 것 뿐만 아니라, 비즈니스 로직에 따라 적절한 에러를 생성하고 다른 레이어에서 처리해야합니다. 그래서 이번 포스팅에서는 Combine에서 에러를 핸들링하는 방법을 정리해보았습니다. 에러의 종류 프로그램에는 2가지 종류의 에러가 있습니다. 개발자 에러와, 사용자 에러입니다. 개발자 에러는 개발 도중, 즉 디버그 모드에서 발생할 수 있는 에러입니다. 개발자 에러를 내기 위해서는 assert문을 주로 사용하며 assert문은 코드를 작성하는 단계에서 문제가 있을 경우 프로그램을 중단하고 에러 메세지를 표시해줍니다. 이를 통해 개발자는 논리가 맞는지 확인하거나, 전달받은 값이 유효한 값인지 확인해볼 수 있습니다. assert문은 릴리..
[Xcode] How to write Doc comments and create DocC(Documentation Catalog). 문서 주석을 작성해야하는 이유 저는 위와 같이 문서 주석을 상당히 좋아하고 열심히 작성하는데요, 그 이유는 다음과 같습니다. 1. Quick Help를 통해 다른 소스파일에서 필요한 내용을 확인하기 위해 이런식으로 필요한 내용들을 적어두면 사용할때마다 편리하게 내용을 볼 수 있습니다. 또한 이렇게 개별적인 변수에 ///주석을 작성하면 어떤 의미인지도 쉽게 확인할 수 있어서 개발 편의성이 상당히 올라갑니다! 2. 다른사람의 참고를 위해서 당연한 이야기지만, 다른 사람이 해당 코드를 쓸 경우에 이해를 돕기 위해서 작성합니다. 최대한 자세히 작성할수록 이해와 사용이 편하겠죠? 이..
[SwiftUI] LinkNavigator (2) - Creating TabBar, Custom NavigationBar 저번 포스팅에 이어서 LinkNavigator를 적용해 개발하며 삽질한 예시를 직접 보여드리려고 하는데요, 탭바와 네비게이션바에 대한 이슈가 조금 있어서 이를 해결해보았습니다. TabBar 구현하기 탭바를 SwiftUI에서 만들어서 root뷰로 올릴지, 오픈소스이므로 패키지를 다운받아서 builder를 통해 탭바를 생성하는 방식으로 커스텀할지 고민이 되었습니다. 결국 둘 다 시도해본 결과, SwiftUI에서 만드는 편이 간편하기도하고 커스텀하기 용이하다는 생각이 들어 이 방식으로 결정하였습니다. 1. TabBar가 들어갈 RootView를 구성해줍니다. 이제 home이나 특정 뷰로 l..
SwiftUI로 개발을 하면서 화면 전환에 대한 불편함을 종종 느끼게 되었는데, 이를 해결할 수 있는 좋은 오픈소스 라이브러리가 있어서 소개해보고자 합니다! 바로 ⭐️LinkNavigator⭐️입니다. 이 라이브러리는 웹에서 URI path를 쓰는 것처럼 path를 이용해 화면전환을 할 수 있게 도와주는데요, 기본적인 push · pop 전환과 stack관리 · 딥링크 기능까지 있습니다. 플리토라는 한국 회사에서 개발한 라이브러리이고 한국어 문서도 잘되어 있어요! 이 라이브러리를 직접 소개하시는 영상이 있는데 참고해보셔도 좋을 것 같습니다! GitHub - interactord/LinkNavigator: 🌊 Easy & Powerful navigation library in SwiftUI 🌊 Easy &..
NavigationStack은 path라는 State 변수에 데이터를 push 함으로써 화면전환을 하는데요, 이때 .navigationDestination이라는 메서드에서 push할 뷰의 정보를 받습니다. 그런데 여러 종류의 View를 push하려면 어떻게 해야할까요? 같은 뷰, 다른 데이터라면? - Struct 같은 뷰에 각각 다른 데이터를 넣어야한다면 struct를 사용할 수 있습니다. 공식 예제에서 나오는 방법이죠! struct ViewContent: Hashable { let number: Int let content: String } 이때 Hashable 프로토콜을 준수해야하더라구요. 이 경우에는 String이라는 프리미티브 타입이 있어서 따로 구현하지 않아도 됐는데요, 만약 다른 struct ..
분리를 결심한 계기 현재 프로젝트에서 ViewModel은 Container View(페이지 단위)와 1:1로 사용하고 있었습니다. 그런데 한 컨테이너뷰에 기능이 많아질 때, 뷰는 컴포넌트를 분리해가며 크기를 유지시킬 수 있었는데, 뷰모델은 계속해서 커지는 문제가 발생했습니다. 현재 Combine을 이용해서 작업하고 있는데 뷰모델이 관리하는 상태가 너무 많아져 어떤 변수가 어디에 쓰이는지 구분하기가 헷갈려졌고, 바인드 코드 또한 관리하기가 어려워졌습니다. 이에 여러 방법을 생각해보다 뷰모델을 분리하기로 결심했습니다. 문제의 뷰모델 import Foundation import Combine class SignupViewModel: ObservableObject { // MARK: - Dependency le..
문득 Task의 사용 방법을 자세히 모르고 있는 것 같아 Swift Concurrency 공식 문서를 정독해보게 되었습니다. https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/ Documentation docs.swift.org 이건 영문이고 https://bbiguduk.gitbook.io/swift/language-guide-1/concurrency 동시성 (Concurrency) - Swift 한 동시성 도메인에서 다른 동시성 도메인으로 공유될 수 있는 타입을 전송 가능 타입 (sendable type) 이라고 합니다. 예를 들어, 액터 메서드로 호출될 때 인수로 전달되거나 작업의 결과로..
일반적인 동기 함수 테스트는 정말 간단합니다. func test_signup_email_validation() { // True XCTAssertTrue(viewModel.isValidEmail("test@example.com")) XCTAssertTrue(viewModel.isValidEmail("user@domain.co.uk")) // Fasle XCTAssertFalse(viewModel.isValidEmail("invalid_email")) XCTAssertFalse(viewModel.isValidEmail("user@.com")) XCTAssertFalse(viewModel.isValidEmail("@domain.com")) } 함수의 input과 output이 명확하므로 손 쉽게 여러 Tes..
- Total
- Today
- Yesterday
- 비동기/동기
- reactive programming
- 프로그래머스
- Swift Concurrency
- 소프트웨어마에스트로
- notion
- RX
- 노션
- MVVM
- Flux
- ios
- TestCode
- design pattern
- 아키텍쳐 패턴
- Architecture Pattern
- SwiftUI
- Bloking/Non-bloking
- GetX
- combine
- swift
- DocC
- healthkit
- programmers
- 코디네이터 패턴
- 리액티브 프로그래밍
- MVC
- MVI
- SWM
- coordinator pattern
- Flutter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |