프로젝트 도중에 Combine을 이용하던 중 Subject를 써야할 일이 있었는데, Published는 프로퍼티 래퍼로 감싸져 있는데 Subject는 그냥 써야해서 좀 아쉽더라구요. typealias 이용하고 있다가 이번에 바꿔보기로 했습니다. 프로퍼티 래퍼(Property Wrapper)란? 우선 프로퍼티 래퍼는 SwiftUI를 쓰시는 분들이라면 모두 익숙하실 @State, @Binding 등 '@' 표시가 붙은 어노테이션을 말합니다. 이 프로퍼티 래퍼는 어떻게 구현되어 있을까요? 바로 @propertyWrapper를 이용해서 만들어집니다. @State의 정의부를 보면 이렇게 프로퍼티 래퍼를 쓴 struct 형태로 정의되어 있는 것을 보실 수 있습니다. 따라서 @propertyWrapper를 사용한다면..
에러 상황 유닛 테스트 타겟을 추가하고 ViewModel 테스트를 위해 뷰모델을 인스턴스화 하려고 하는데 컴파일러가 뷰모델을 못 찾고 있습니다. 해결 방안 @testable import [프로젝트 이름]을 추가해주면 해결됩니다. private var viewModel: AtchI.AnyViewModel! 이후 이렇게 프로젝트 명으로 더 명확하게 접근할 수도 있습니다. (import 타겟이 하나거나 다른 타겟에 같은 클래스명이 없다면 프로젝트명. 은 필수로 작성하지 않아도 됩니다.) +) XCTest import 문제 저는 프로젝트 생성 당시 테스트 타겟을 추가하지 않아서인지 라이브러리 import가 되어있지 않았습니다. Target > Build Phases > Link Binary With Librar..
문제 상황 info.plist에 위와 같이 런치스크린 배경색과 로고를 지정해주었는데 실행 시 로고가 깨지는 문제가 발생했습니다. 해결 방안 Assets에 추가한 로고 이미지에 가보면 이렇게 1x, 2x, 3x가 있는데요. 기기마다 대응되도록 이미지 크기를 각각 설정해주어야합니다. 1x가 200x200라면, 2x는 400x400, 3x는 600x600 (단위: px)로 설정해주시면 됩니다. 저는 120x120, 240x240, 360x360으로 해주었습니다. SE, 14 pro, 14 plus 에서 테스트 해보았습니다. 다양한 해상도에서도 런치 스크린 로고가 깨지지 않고 출력됩니다 ⚠️ 만약 적용이 되지 않는다면 시뮬레이터 안에서 앱을 지우고 시뮬레이터을 껐다가 다시 실행시켜주세요. + 업데이트 23.05..
HealthKit에서는 데이터를 처리할 때 각각 용도에 맞게 정의된 타입으로 처리하는데요. 이에 대해 정리해보았습니다. DataTypes (표현 방식 분류) 건강 데이터의 표현 방식을 식별하는데 사용됩니다. let bloodType = HKObjectType.characteristicType(forIdentifier: .bloodType) let caloriesConsumed = HKObjectType.quantityType(forIdentifier: .dietaryEnergyConsumed) let sleepAnalysis = HKObjectType.categoryType(forIdentifier: .sleepAnalysis) 이처럼 각 데이터를 표현하기 적절한 type과 구체적인 데이터 종류인 Ide..
애플 프레임워크에서 제공하는 Healthkit을 사용해 사용자의 수면정보를 가져와보겠습니다. 1. Info.plist에 읽기/쓰기 권한 설정 및 표시 문구 설정 먼저, 정보 접근을 위해 사용자 동의를 얻어야합니다. Target > Info > Custom iOS Target Properties (or WatchOS Target Properties) 1. + 버튼을 눌러서 Privacy - Health .. 를 적어줍니다. 2. 권한은 Share(읽기권한), Update(쓰기권한) 중 필요한 것을 설정해줍니다. 3. 접근 권한을 허용할 때 뜰 문구를 Value에 써줍니다. Record 권한은 Healthkit 샘플이 아닌 '의료기록'에 관한 접근 권한입니다. 필요에 따라 설정해주세요. 2. Signing..
에러 메세지 Build input file cannot be found: '/file path'. Did you forget to declare this file as an output of a script phase or custom build rule which produces it? 해당 에러는 프로젝트 파일이 특정 파일을 찾지 못해 발생하는 오류입니다. 제 경우에는 Git에서 머지하는 과정에서 프로젝트 파일이 충돌했는데 이걸 해결하면서 파일이 손실된 것 같습니다. 일단 중요한 파일은 아니라 다음과 같이 해결했습니다. 해결방안 Target > Build Phases > Compile Sources 여기서 소스파일들을 살펴보니 문제를 일으켰던 파일의 아이콘이 흐릿하네요. Delete키를 이용해 삭제해..
기존 프로젝트를 스토리보드에서 코드기반 UI로 리팩토링하면서 네비게이션이 복잡해져 코디네이터 패턴을 적용하고 있는데요, 가장 기본이 되는 TabBar를 코드로 작성하는 방법을 공유해보려고 합니다! 탭바가 생각보다 복잡한 구조를 가지고 있어서 설정하기가 좀 어려웠습니다. ʕᴗ̩̩ᴥᴗ̩̩ʔ 그래서 코디네이터 패턴보단 탭바의 구조부터 자세히 알아보고 실제 코드에서 코디네이터패턴을 적용해 보여드리겠습니다. TabBarController 구성 알아보기 TabBar를 생성하기 위해 TabBar가 어떻게 구성되는지 알아보겠습니다. TabBar는 UITabBarController로 생성할 수 있는데요, 이 UITabBarController안에는 Bar자체인 UITabBar가 있고 그 안에 홈, 설정 등 각 뷰를 담당하..
스토리보드와 제약조건 방식의 UI 구성은 관리하기가 매우 어렵습니다. SwiftUI는 편리하지만 아직 UIKit을 완전히 대체하기엔 무리가 있죠. 그래서 스토리보드 대안으로 사용되는 여러 라이브러리들이 나오게 되었는데요, 그 중 FlexLayout에 대해 알아보겠습니다. 먼저 FlexLayout과 함께 사용되는 PinLayout부터 알아보겠습니다. PinLayout CSS absolute position 방식에 기반한 레이아웃 섬세한 조정과 애니메이션에 유용합니다. 한번에 하나의 뷰를 배치할 때 유리합니다. top, left, bottom, right 속성을 이용해서 레이아웃합니다. .top(10)이면 super view의 위에서 10 떨어진 곳에 위치하는 방식입니다. 기본적으로 super view 기준..
- Total
- Today
- Yesterday
- MVI
- 아키텍쳐 패턴
- design pattern
- Bloking/Non-bloking
- TestCode
- swift
- Flux
- GetX
- 비동기/동기
- Architecture Pattern
- notion
- Swift Concurrency
- DocC
- 소프트웨어마에스트로
- 프로그래머스
- SWM
- coordinator pattern
- 노션
- programmers
- 코디네이터 패턴
- 리액티브 프로그래밍
- MVVM
- healthkit
- RX
- combine
- Flutter
- MVC
- SwiftUI
- reactive programming
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |