[Feat] 탭바 구현#20
Conversation
- 기존 White 계열 컬러들 Orange로 수정 - HomeGradient 색상 및 Error 색상 추가
Walkthrough이번 변경사항은 주로 import 구문의 순서 조정 및 불필요한 Foundation import 제거와 같은 코드 정리에 집중되어 있습니다. 또한, 새로운 컬러 및 이미지 에셋 추가, 탭바 뷰(TabBarView) 및 관련 아이콘/컬러 enum 확장 등 UI 리소스와 디자인 시스템이 보강되었습니다. 기능적 로직 변경은 없으며, 리소스 및 코드 구조 개선이 주를 이룹니다. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant TabBarView
participant HomeView
participant RecommendView
participant ReportView
participant MypageView
User->>TabBarView: 앱 실행/탭바 진입
TabBarView->>TabBarView: viewDidLoad() 호출
TabBarView->>TabBarView: configureAttribute()로 appearance 및 탭 설정
TabBarView->>HomeView: HomeView 생성 및 네비게이션 컨트롤러에 삽입
TabBarView->>RecommendView: RecommendView 생성 및 네비게이션 컨트롤러에 삽입
TabBarView->>ReportView: ReportView 생성 및 네비게이션 컨트롤러에 삽입
TabBarView->>MypageView: MypageView 생성 및 네비게이션 컨트롤러에 삽입
User->>TabBarView: 탭 아이콘 선택
TabBarView->>해당 View: 선택된 뷰로 전환
Poem
📜 Recent review detailsConfiguration used: .coderabbit.yaml 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Actionable comments posted: 4
🔭 Outside diff range comments (2)
Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (1)
100-103:nextButton액션에서 강한 순환 참조 발생 가능성
UIAction클로저가self를 강하게 캡처하여OnboardingView → nextButton → UIAction → self형태의 retain cycle이 형성될 수 있습니다. 다른 버튼 액션(89-91라인)은[weak self]를 사용하고 있으므로 동일하게 수정해 주세요.- nextButton.addAction(UIAction { _ in - self.goNextStep() - }, for: .touchUpInside) + nextButton.addAction(UIAction { [weak self] _ in + self?.goNextStep() + }, for: .touchUpInside)Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (1)
57-63: 지연 애니메이션에서 strong self 캡처로 인한 메모리 누수 가능성
지연 3초 후 실행되는UIView.animate의animations클로저가self를 강하게 캡처합니다.
화면이 사라지기 전에 해제되지 않을 수 있어 누수 위험이 있습니다.- UIView.animate(withDuration: 0.5, delay: 3, options: .curveEaseInOut, animations: { - self.view.alpha = 0.0 + UIView.animate(withDuration: 0.5, delay: 3, options: .curveEaseInOut, animations: { [weak self] in + self?.view.alpha = 0.0 }, completion: { [weak self] finished in guard let self else { return } let recommendedRoutineView = OnboardingRecommendedRoutineView(viewModel: self.viewModel) self.navigationController?.pushViewController(recommendedRoutineView, animated: true) })
🧹 Nitpick comments (7)
Projects/Presentation/Sources/Login/View/TermsAgreementView.swift (1)
10-14: SafariServices·UIKit 그룹핑 방식 재검토 권장Apple 프레임워크끼리는 보통 같은 블록에 묶는 경우가 많습니다.
SafariServices,UIKit을 연달아 배치해도 컴파일에는 영향 없지만, Swift-Format 등 자동 포매터 규칙을 미리 정해 두면 PR 단에서 반복 리뷰를 줄일 수 있습니다.Projects/Persistence/Sources/UserDefaults/UserDefaultsStorage.swift (1)
8-9:Foundation임포트 위치 변경이 팀 컨벤션과 일치하는지 확인 필요
Foundation-을 도메인 모듈(DataSource) 아래쪽에 배치한 이유가 명확하다면 문제 없으나,
다른 파일(예:AppDelegate,SceneDelegate)과 정렬 기준이 일관적인지 한번 더 확인해 주세요.
컨벤션이 없다면 알파벳순 또는 시스템 프레임워크 우선 정렬이 유지보수에 유리합니다.Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/Contents.json (1)
3-17: 파일명에 쉼표와 공백 포함 — 추후 리소스 접근 시 오타 위험
navigation=_mypage, status=empty.png처럼 쉼표·공백·등호가 들어간 파일명은
코드 레벨에서 문자열 타이핑 시 실수 가능성이 높습니다.
가능하면navigation_mypage_empty.png형태로 단순화하는 것을 권장드립니다.Projects/Presentation/Sources/Login/View/Component/TermsAgreementItemView.swift (1)
8-10: 임포트 순서 통일 확인
Domain → SnapKit → UIKit순서로 재배치된 점 확인했습니다. 동일 규칙이 다른 파일에도 일관되게 적용되고 있는지 CI/Lint 레벨에서 검증되면 좋겠습니다.Projects/NetworkService/Sources/NetworkService.swift (1)
8-10: Foundation을 아래로 이동한 이유 재확인 필요일반적으로 Swift 표준 라이브러리(
Foundation)를 최상단에 두는 경우가 많아 기존 관례와 다릅니다.
프로젝트 내 규칙(예: 모듈 의존성 관계별 정렬)이라면 OK이지만, 아니면 불필요한 diff noise가 될 수 있으니 한 번 더 검토 바랍니다.Projects/NetworkService/Sources/Extension/Endpoint+.swift (1)
8-10: 동일한 임포트 순서 규칙 적용위 파일과 동일한 코멘트입니다. 컨벤션 확정을 위해 README나 SwiftLint 설정에 규칙을 명시해 두시면 향후 충돌을 줄일 수 있습니다.
Projects/Presentation/Sources/Common/TabBarView.swift (1)
75-102: 플레이스홀더 뷰 컨트롤러들이 임시 구현 목적에 맞게 구현되었습니다.PR 목표에 명시된 대로 실제 뷰 구현이 완료될 때까지의 임시 구현으로 적절합니다. TODO 주석은 정당한 임시 코드를 나타내므로 실제 뷰 구현 시 제거하면 됩니다.
실제 뷰 구현을 위한 이슈 트래킹이나 구현 가이드가 필요하시면 도움을 드릴 수 있습니다.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (24)
Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/navigation=home, status=empty.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/navigation=home, status=empty@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/navigation=home, status=empty@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/navigation=home, status=fill.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/navigation=home, status=fill@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/navigation=home, status=fill@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/navigation=_mypage, status=empty.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/navigation=_mypage, status=empty@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/navigation=_mypage, status=empty@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/navigation=_mypage, status=fill.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/navigation=_mypage, status=fill@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/navigation=_mypage, status=fill@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/navigation=recommend, status=empty.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/navigation=recommend, status=empty@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/navigation=recommend, status=empty@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/navigation=recommend, status=fill.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/navigation=recommend, status=fill@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/navigation=recommend, status=fill@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/navigation=report, status=empty.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/navigation=report, status=empty@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/navigation=report, status=empty@3x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/navigation=report, status=fill.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/navigation=report, status=fill@2x.pngis excluded by!**/*.pngProjects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/navigation=report, status=fill@3x.pngis excluded by!**/*.png
📒 Files selected for processing (45)
Projects/App/Sources/AppDelegate.swift(1 hunks)Projects/App/Sources/DependencyInjection.swift(1 hunks)Projects/App/Sources/SceneDelegate.swift(1 hunks)Projects/Domain/Sources/DomainDependencyAssembler.swift(0 hunks)Projects/Domain/Sources/UseCase/Auth/LoginUseCase.swift(0 hunks)Projects/Domain/Sources/UseCase/Auth/LogoutUseCase.swift(0 hunks)Projects/Domain/Sources/UseCase/Auth/WithdrawUseCase.swift(0 hunks)Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift(0 hunks)Projects/NetworkService/Sources/Extension/Endpoint+.swift(1 hunks)Projects/NetworkService/Sources/NetworkDependencyAssembler.swift(0 hunks)Projects/NetworkService/Sources/NetworkError.swift(0 hunks)Projects/NetworkService/Sources/NetworkService.swift(1 hunks)Projects/Persistence/Sources/Keychain/KeychainStorage.swift(1 hunks)Projects/Persistence/Sources/PersistenceDependencyAssembler.swift(0 hunks)Projects/Persistence/Sources/UserDefaults/UserDefaultsStorage.swift(1 hunks)Projects/Presentation/Resources/Colors.xcassets/Error.colorset/Contents.json(1 hunks)Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientLeft.colorset/Contents.json(1 hunks)Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientRight.colorset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/Contents.json(1 hunks)Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift(2 hunks)Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift(1 hunks)Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift(0 hunks)Projects/Presentation/Sources/Common/TabBarView.swift(1 hunks)Projects/Presentation/Sources/Home/HomeViewController.swift(1 hunks)Projects/Presentation/Sources/Login/Model/TermsType.swift(1 hunks)Projects/Presentation/Sources/Login/View/Component/SocialLoginButton.swift(1 hunks)Projects/Presentation/Sources/Login/View/Component/TermsAgreementItemView.swift(1 hunks)Projects/Presentation/Sources/Login/View/Component/TotalAgreementButton.swift(1 hunks)Projects/Presentation/Sources/Login/View/IntroView.swift(1 hunks)Projects/Presentation/Sources/Login/View/LoginView.swift(1 hunks)Projects/Presentation/Sources/Login/View/TermsAgreementView.swift(1 hunks)Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift(1 hunks)Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift(1 hunks)Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift(1 hunks)Projects/Presentation/Sources/Protocol/BaseViewController.swift(0 hunks)Projects/Presentation/Sources/Protocol/ViewModel.swift(0 hunks)Projects/Shared/Sources/DIContainer/DIContainer.swift(0 hunks)Projects/Shared/Sources/DIContainer/DependencyAssemblerProtocol.swift(0 hunks)
💤 Files with no reviewable changes (13)
- Projects/Domain/Sources/DomainDependencyAssembler.swift
- Projects/Shared/Sources/DIContainer/DIContainer.swift
- Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift
- Projects/Domain/Sources/UseCase/Auth/LogoutUseCase.swift
- Projects/NetworkService/Sources/NetworkDependencyAssembler.swift
- Projects/Presentation/Sources/Protocol/ViewModel.swift
- Projects/Persistence/Sources/PersistenceDependencyAssembler.swift
- Projects/Shared/Sources/DIContainer/DependencyAssemblerProtocol.swift
- Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift
- Projects/Presentation/Sources/Protocol/BaseViewController.swift
- Projects/Domain/Sources/UseCase/Auth/WithdrawUseCase.swift
- Projects/NetworkService/Sources/NetworkError.swift
- Projects/Domain/Sources/UseCase/Auth/LoginUseCase.swift
🧰 Additional context used
🧠 Learnings (9)
📓 Common learnings
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift:0-0
Timestamp: 2025-07-16T10:57:16.559Z
Learning: choijungp는 추후 CustomAlertView를 만들어서 에러 처리를 UI로 해결하도록 수정할 계획을 가지고 있음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift:0-0
Timestamp: 2025-07-16T10:58:30.858Z
Learning: choijungp는 OnboardingUseCase의 convertToDictionary 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
Projects/Presentation/Sources/Login/View/IntroView.swift (1)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Login/View/LoginView.swift (1)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Home/HomeViewController.swift (1)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Login/View/TermsAgreementView.swift (1)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (3)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Login/View/TermsAgreementView.swift:44-46
Timestamp: 2025-07-16T09:09:13.869Z
Learning: BaseViewController의 viewDidLoad() 메서드에서 이미 configureAttribute(), configureLayout(), bind()를 호출하므로, 하위 클래스에서 super.viewDidLoad()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Login/View/TermsAgreementView.swift:44-46
Timestamp: 2025-07-16T09:09:13.869Z
Learning: BaseViewController의 viewDidLoad() 메서드에서 이미 configureAttribute(), configureLayout(), bind()를 호출하므로, 하위 클래스에서 super.viewDidLoad()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (1)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift (1)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Common/TabBarView.swift (3)
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Login/View/TermsAgreementView.swift:44-46
Timestamp: 2025-07-16T09:09:13.869Z
Learning: BaseViewController의 viewDidLoad() 메서드에서 이미 configureAttribute(), configureLayout(), bind()를 호출하므로, 하위 클래스에서 super.viewDidLoad()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Login/View/TermsAgreementView.swift:44-46
Timestamp: 2025-07-16T09:09:13.869Z
Learning: BaseViewController의 viewDidLoad() 메서드에서 이미 configureAttribute(), configureLayout(), bind()를 호출하므로, 하위 클래스에서 super.viewDidLoad()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
🪛 SwiftLint (0.57.0)
Projects/Presentation/Sources/Common/TabBarView.swift
[Warning] 75-75: TODOs should be resolved (- 홈, 추천, 마이페이지 생성 후 지워주세요)
(todo)
🔇 Additional comments (24)
Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (1)
8-10: import 순서 변경 문제없음
UIKit을 하위 모듈 import 뒤로 이동한 변경은 프로젝트 전반의 컨벤션 통일을 위한 것으로 보이며, 기능상 영향이 없습니다.Projects/App/Sources/SceneDelegate.swift (1)
11-11: UIKit import 순서 변경 확인 – 문제 없음팀 코드 컨벤션에 맞춘 import 재정렬으로 보이며, 컴파일·동작에 영향 없습니다.
Projects/Presentation/Sources/Login/Model/TermsType.swift (1)
9-9: import 순서 정리 👍
Domain→Foundation순으로 통일하여 모듈 계층 구조가 더 명확해졌습니다.Projects/Presentation/Sources/Login/View/IntroView.swift (1)
8-11: Shared → UIKit 순서 변경으로 일관성 확보다른 파일들과 동일한 규칙(외부 모듈 → Apple 프레임워크) 적용이 확인되었습니다.
Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift (1)
11-11: UIKit import 위치 조정 확인가독성 향상을 위한 정리로, 추가적인 이슈는 없습니다.
Projects/Presentation/Sources/Login/View/LoginView.swift (1)
13-13: 불필요한 변경 없음 – import 순서 정리 👍
UIKit위치만 변경되었으며, 기능적 영향 없음.Projects/App/Sources/AppDelegate.swift (1)
10-10: 가독성 향상을 위한 import 재배치 확인
UIKit을 하위로 이동한 변경 사항 문제 없습니다.Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (1)
10-10: import 순서 재정렬 OK
의미-있는 로직 변경은 없으므로 그대로 진행해도 됩니다.Projects/Presentation/Sources/Home/HomeViewController.swift (1)
8-12: import 순서/불필요한 Foundation 제거 확인
정리된 import 구문이 컨벤션에 부합합니다.Projects/Persistence/Sources/Keychain/KeychainStorage.swift (1)
9-9: import 위치 변경 문제 없음
Foundation을 뒤로 이동한 변경이 다른 코드에 영향 주지 않습니다.Projects/Presentation/Sources/Login/View/Component/TotalAgreementButton.swift (1)
8-9: UIKit 임포트 위치 변경 OK프로젝트 전반에서 동일한 임포트 순서 규칙을 적용하고 있으므로 일관성 확보 측면에서 👍🏻
추가로, 설정된 SwiftLint 규칙(예:sorted_imports)과 충돌이 없는지만 한 번 더 확인 부탁드립니다.Projects/Presentation/Sources/Login/View/Component/SocialLoginButton.swift (1)
8-9: 임포트 정렬 변경 문제없음기능 변화 없고 컨벤션만 수정된 것으로 보입니다. 🚀
Projects/App/Sources/DependencyInjection.swift (1)
8-14: import 순서 변경 👍
Foundation을 도메인 계층 이후로 내린 것은 프로젝트 전반에서 합의된 컨벤션( Domain → Foundation → Infra … )과 일관됩니다. 별다른 사이드-이펙트나 컴파일 경고가 발생하지 않는다면 그대로 유지하셔도 무방합니다.Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/Contents.json (1)
1-23: 이미지 세트 추가 확인 완료파일 구조, scale 별 변형, 메타데이터 모두 정상입니다.
Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/Contents.json (1)
1-23: 리소스 정의 무난특이사항 없습니다. TabBarView에서 정상적으로 매핑되는지만 한번 더 빌드 확인 부탁드립니다.
Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/Contents.json (1)
1-23: home_empty_icon 세트 이상 무구조 및 메타데이터 이상 없습니다.
Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/Contents.json (1)
1-23: Contents.json 내부 filename 언더스코어 제거 불필요Contents.json의
filename필드는 에셋 카탈로그 내 리소스 파일명을 Xcode에 알려주는 용도이며, 런타임에UIImage(named:)는 에셋 폴더명(mypage_fill_icon)을 기준으로 이미지를 로딩합니다. 따라서 내부 PNG 파일명에_mypage언더스코어가 포함되어 있어도 이미지 로딩에는 문제가 없습니다.Likely an incorrect or invalid review comment.
Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/Contents.json (1)
1-23: 아이콘 리소스 추가 확인 완료
구조와 메타데이터가 Xcode 기본 포맷을 정확히 따르고 있습니다. 별다른 이슈 없습니다.Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/Contents.json (1)
1-23: 아이콘 리소스 추가 확인 완료
파일명·스케일·idiom 설정 모두 정상입니다.Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/Contents.json (1)
1-23: 아이콘 리소스 추가 확인 완료
문제 될 만한 부분이 없습니다.Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift (1)
18-30: 옵셔널 UIImage 전달 시 크래시 위험 없음 확인 필요
현재BitnagilIcon의 아이콘들은
UIImage(named: …)?로 안전하게 optional chaining 처리되고UITabBarItem(title:image:selectedImage:)은UIImage?파라미터를 허용하므로
이미지가nil이더라도 런타임 크래시는 발생하지 않습니다.
따라서 제안된guard let도입은 필수적이지 않습니다.다만, 다음 부분은 한 번 더 검토해 주세요:
- home/recommend/mypage 아이콘은 시스템 Tint 사용, report 아이콘만
.alwaysOriginal로 설정된 의도- (선택) SwiftGen 등 타입-세이프 자산 관리 도입 검토
Likely an incorrect or invalid review comment.
Projects/Presentation/Sources/Common/TabBarView.swift (3)
11-16: 클래스 선언과 초기화 로직이 올바르게 구현되었습니다.
final public class와super.viewDidLoad()호출이 적절하고, 설정 로직을 별도 메서드로 분리한 것도 좋은 구조입니다.
18-40: 탭바 외관 설정이 체계적으로 잘 구현되었습니다.
UITabBarAppearance를 사용한 모던한 스타일링과 커스텀 컬러/폰트 적용, 그리고 nil 병합 연산자를 통한 안전한 fallback 처리가 잘 되어있습니다.
41-72: 탭바 아이템 구성과 뷰 컨트롤러 설정이 올바르게 구현되었습니다.네비게이션 컨트롤러로 감싸는 것과 selected/unselected 이미지 설정이 적절합니다. 현재 플레이스홀더 뷰들은 실제 구현이 완료되면 교체될 예정이므로 임시적인 구현으로 적절합니다.
| { | ||
| "colors" : [ | ||
| { | ||
| "color" : { | ||
| "color-space" : "srgb", | ||
| "components" : { | ||
| "alpha" : "1.000", | ||
| "blue" : "0x68", | ||
| "green" : "0x68", | ||
| "red" : "0xFF" | ||
| } | ||
| }, | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
There was a problem hiding this comment.
Color components 값 형식 오류 – 0xFF, 0x68 사용은 Xcode 빌드 실패 야기
Asset-catalog JSON 의 components 값은 0~1 사이 소수 문자열이어야 합니다.
0xFF, 0x68 처럼 16진 문자열을 넣으면 actool 단계에서 오류가 발생합니다.
아래 패치처럼 255 로 나눈 실수값으로 교체해 주세요.
- "blue" : "0x68",
- "green" : "0x68",
- "red" : "0xFF"
+ "blue" : "0.408",
+ "green" : "0.408",
+ "red" : "1.000"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| { | |
| "colors" : [ | |
| { | |
| "color" : { | |
| "color-space" : "srgb", | |
| "components" : { | |
| "alpha" : "1.000", | |
| "blue" : "0x68", | |
| "green" : "0x68", | |
| "red" : "0xFF" | |
| } | |
| }, | |
| "idiom" : "universal" | |
| } | |
| ], | |
| "info" : { | |
| "author" : "xcode", | |
| "version" : 1 | |
| } | |
| } | |
| { | |
| "colors" : [ | |
| { | |
| "color" : { | |
| "color-space" : "srgb", | |
| "components" : { | |
| "alpha" : "1.000", | |
| "blue" : "0.408", | |
| "green" : "0.408", | |
| "red" : "1.000" | |
| } | |
| }, | |
| "idiom" : "universal" | |
| } | |
| ], | |
| "info" : { | |
| "author" : "xcode", | |
| "version" : 1 | |
| } | |
| } |
🤖 Prompt for AI Agents
In Projects/Presentation/Resources/Colors.xcassets/Error.colorset/Contents.json
lines 1 to 20, the color component values use hexadecimal strings like "0xFF"
and "0x68" which cause Xcode build failures. Replace these hex strings with
decimal string values representing the component as a fraction between 0 and 1
by dividing the hex value by 255 (e.g., "0xFF" becomes "1.0" and "0x68" becomes
approximately "0.4078").
| { | ||
| "colors" : [ | ||
| { | ||
| "color" : { | ||
| "color-space" : "srgb", | ||
| "components" : { | ||
| "alpha" : "1.000", | ||
| "blue" : "0xFF", | ||
| "green" : "0xF7", | ||
| "red" : "0xF0" | ||
| } | ||
| }, | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
There was a problem hiding this comment.
Color components 형식 오류 – 16진 문자열 사용
여기도 동일한 형식 오류가 있습니다. 실수값으로 교체해야 합니다.
- "blue" : "0xFF",
- "green" : "0xF7",
- "red" : "0xF0"
+ "blue" : "1.000",
+ "green" : "0.969",
+ "red" : "0.941"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| { | |
| "colors" : [ | |
| { | |
| "color" : { | |
| "color-space" : "srgb", | |
| "components" : { | |
| "alpha" : "1.000", | |
| "blue" : "0xFF", | |
| "green" : "0xF7", | |
| "red" : "0xF0" | |
| } | |
| }, | |
| "idiom" : "universal" | |
| } | |
| ], | |
| "info" : { | |
| "author" : "xcode", | |
| "version" : 1 | |
| } | |
| } | |
| { | |
| "colors" : [ | |
| { | |
| "color" : { | |
| "color-space" : "srgb", | |
| "components" : { | |
| "alpha" : "1.000", | |
| "blue" : "1.000", | |
| "green" : "0.969", | |
| "red" : "0.941" | |
| } | |
| }, | |
| "idiom" : "universal" | |
| } | |
| ], | |
| "info" : { | |
| "author" : "xcode", | |
| "version" : 1 | |
| } | |
| } |
🤖 Prompt for AI Agents
In
Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientRight.colorset/Contents.json
lines 1 to 20, the color component values for red, green, and blue are
incorrectly specified as hexadecimal strings like "0xFF". Replace these hex
string values with their equivalent decimal float values between 0 and 1 (e.g.,
"1.0" for 0xFF) to conform to the expected format.
| { | ||
| "colors" : [ | ||
| { | ||
| "color" : { | ||
| "color-space" : "srgb", | ||
| "components" : { | ||
| "alpha" : "1.000", | ||
| "blue" : "0xDF", | ||
| "green" : "0xEA", | ||
| "red" : "0xFF" | ||
| } | ||
| }, | ||
| "idiom" : "universal" | ||
| } | ||
| ], | ||
| "info" : { | ||
| "author" : "xcode", | ||
| "version" : 1 | ||
| } | ||
| } |
There was a problem hiding this comment.
Color components 형식 오류 – 16진 문자열 사용
마찬가지로 값 변환이 필요합니다.
- "blue" : "0xDF",
- "green" : "0xEA",
- "red" : "0xFF"
+ "blue" : "0.875",
+ "green" : "0.918",
+ "red" : "1.000"🤖 Prompt for AI Agents
In
Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientLeft.colorset/Contents.json
lines 1 to 20, the color component values for red, green, and blue are
incorrectly formatted as hexadecimal strings (e.g., "0xFF"). These should be
converted to decimal strings representing normalized float values between 0 and
1 (e.g., "1.000" for full intensity). Update each color component value
accordingly to fix the format error.
🌁 Background
각 기능 구현을 하기 위해 탭 바를 구현하였습니다.
이를 위해 탭 아이콘 asset을 추가하고 TabBarView를 구현하였습니다.
📱 Screenshot
👩💻 Contents
📝 Review Note
Summary by CodeRabbit
New Features
Style
Chores