Conversation
WalkthroughCodeRabbit 설정 파일 추가, Xcode 워크스페이스/프로젝트 구성 추가·재구성, 다수의 iOS 배포 대상 변경(17.0 → 16.6), Splash 모듈(리듀서/뷰/프로젝트/스킴/플리스트/테스트) 신규 추가, DesignSystem 리팩터(이미지/색상/폰트/번들 접근), 앱 진입부·DI·리듀서 연동, 및 여러 서드파티 의존성(Alamofire/AsyncMoya/Moya/RxSwift 등) 추가. Changes
Sequence Diagram(s)sequenceDiagram
actor User
participant App as MusicBandscapeApp
participant AD as AppDelegate
participant DI as AppWeaveDI.Container
participant Store as Store<AppReducer>
participant Reducer as AppReducer
participant Splash as SplashReducer
User->>App: 앱 실행
App->>AD: UIApplicationDelegateAdaptor 초기화
AD->>DI: Container.bootstrapInTask() (비동기)
DI->>DI: registerRepositories(), registerUseCases() (async 흐름)
App->>Store: Store(initial: AppReducer.State(), reducer: AppReducer())
Store->>Reducer: 초기 상태 .splash 활성화
Reducer->>Splash: .ifCaseLet로 SplashReducer 연결
Splash-->>Store: 애니메이션 액션 시퀀스(지연 포함)
Splash->>Reducer: navigation.presentMain (1s 이후)
Reducer->>Store: .view(.presentMain) (애니메이션 완료 후 내비게이션)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60분
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 24
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj (1)
701-719: Release 구성에서 매크로 플러그인 경로가 Debug로 고정되어 있음 - 60개 인스턴스 발견검증 결과
project.pbxproj파일 전체에 걸쳐 60개의 하드코딩된 Debug 경로가 확인되었습니다. 이는 10개의OTHER_SWIFT_FLAGS섹션에 분산되어 있으며, Release 빌드 및 CI 환경에서 플러그인 로드 실패를 야기합니다.지정된 모든 라인 범위(701-719, 770-782, 887-898, 1002-1013)에서 다음 패턴이 일관되게 나타남:
"$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/[PluginName]#[PluginName]"필수 수정사항:
모든
-load-plugin-executable항목에서Debug를$(CONFIGURATION)으로 일괄 치환:- "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros" + "$BUILD_DIR/$(CONFIGURATION)$EFFECTIVE_PLATFORM_NAME/CasePathsMacros#CasePathsMacros"이 패턴을 ComposableArchitectureMacros, DependenciesMacrosPlugin, LogMacroMacro, PerceptionMacros, WeaveDIMacros의 모든 인스턴스(6개 매크로 × 10개 섹션)에 적용하세요.
🧹 Nitpick comments (27)
Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Enviorment.swift (1)
1-10: 파일 경로의 오타를 수정하는 것을 고려하세요.파일 경로에 오타가 있습니다:
Templete→TemplateEnviorment→Environment코드 내부(Line 2)에서는 올바르게
Environment로 표기되어 있지만, 파일 경로는 일관성이 없습니다. 검색 가능성과 유지보수성을 위해 파일명을 수정하는 것이 좋습니다.Projects/Shared/Shared/Shared.xcodeproj/project.pbxproj (1)
18-18: 새로운 네트워킹 의존성 추가를 검토하세요.프로젝트에 여러 네트워킹 및 반응형 프로그래밍 프레임워크가 추가되었습니다:
- Alamofire (HTTP 클라이언트)
- Moya + 변형들 (AsyncMoya, RxMoya, CombineMoya)
- RxSwift
- EventLimiter
- CFNetwork
고려사항:
- Moya의 여러 변형(Async, Rx, Combine)이 모두 필요한지 확인하세요. 프로젝트에서 실제로 사용하는 방식에 맞춰 하나만 선택하는 것이 좋습니다.
- CFNetwork는 Alamofire를 사용할 때 일반적으로 직접 참조할 필요가 없습니다.
Also applies to: 43-44, 57-57, 62-63, 71-71
.coderabbit.yaml (1)
1-16: 구성 유효합니다 — 워크플로우 설명만 살짝 명확화 권장
- 설정 자체는 스키마에 부합합니다.
request_changes_workflow: true주석을 “코멘트가 해결되고 프리머지 체크가 통과되면 자동 승인” 정도로 구체화하면 오해를 줄일 수 있습니다.- 필요하다면
path_filters로 대용량 경로(예:**/*.xcodeproj,Tuist/.build/**) 제외를 추가해 리뷰 노이즈를 줄이는 것도 방법입니다.Projects/Shared/ThirdParty/Project.swift (1)
16-18: ThirdParty 모듈에 AsyncMoya 연동 LGTM의존성 추가가 전체 그래프(Tuist/Package.swift, Package.resolved)와 일관됩니다. 후속 모듈에서만 사용하도록 노출 범위를 최소화하면(필요한 타겟에만 의존성 전달) 빌드 시간을 줄일 수 있습니다.
Projects/Shared/ThirdParty/ThirdParty.xcodeproj/project.pbxproj (2)
118-156: Copy Files “Dependencies” 단계 재검토정적 프레임워크/라이브러리 타겟에서 다른 프레임워크를 Copy Files로 복사하면 상위 앱 타겟과 중복 임베딩/패키징 이슈가 날 수 있습니다. 일반적으로 라이브러리 타겟은 링크만 하고, 임베드는 앱 타겟에서 처리합니다. 필요 최소한으로 줄이는 것을 권장합니다.
빌드 산출물 중복 여부를 CI 아티팩트에서 확인해 주세요.
Also applies to: 190-201
12-12: Alamofire_Alamofire.bundle 리소스 포함 필요성 확인Alamofire는 일반적으로 앱 리소스를 요구하지 않습니다. 번들이 실제 생성·존재하지 않으면 테스트 타겟 리소스 단계에서 빌드 에러가 날 수 있습니다. 반드시 필요할 때만 포함하거나 자동(SwiftPM) 임베딩에 맡기는 편이 안전합니다.
Also applies to: 618-621
Tuist/Package.swift (1)
20-21: AsyncMoya 추가는 양호 — 보안 URL 리팩토링 권장
- 라인 20-21의 WeaveDI와 AsyncMoya 의존성 추가는 모두 HTTPS를 올바르게 사용하고 있습니다.
- AsyncMoya 버전
from: "1.1.5"는 합리적인 범위 지정이나, 팀 재현성을 위해from: "1.1.6"또는exact고정도 검토해 주세요.- 라인 18의 swift-composable-architecture 의존성이 http:// URL을 사용 중입니다. SPM 원격 URL은 보안상 HTTPS 권장입니다:
- .package(url: "http://github.com/pointfreeco/swift-composable-architecture", exact: "1.18.0"), + .package(url: "https://github.com/pointfreeco/swift-composable-architecture", exact: "1.18.0"),Projects/App/Sources/View/ContentView.swift (1)
20-24: Preview 위치를 개선하는 것을 권장합니다.SplashView의 preview가 ContentView.swift 파일에 추가되었습니다. 각 뷰의 preview는 해당 뷰가 정의된 파일에 위치하는 것이 코드 구성 측면에서 더 좋습니다.
SplashView preview를
Projects/Presentation/Splash/Sources/View/SplashView.swift파일로 이동하는 것을 고려해주세요.-#Preview { - SplashView(store: .init(initialState: SplashReducer.State(), reducer: { - SplashReducer() - })) -}위 preview 코드를 SplashView.swift 파일로 이동:
// Projects/Presentation/Splash/Sources/View/SplashView.swift 파일에 추가 #Preview { SplashView(store: .init(initialState: SplashReducer.State(), reducer: { SplashReducer() })) }Plugins/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+Module/Modules.swift (1)
3-6: 중복 import 제거 필요
ProjectTemplatePlugin을 두 번 import하고 있어 SwiftLintduplicate_imports경고가 발생합니다. 불필요한 import를 제거해 주세요.-import ProjectTemplatePlugin import ProjectTemplatePluginProjects/Presentation/Splash/Project.swift (1)
3-6: 중복 import 제거 필요여기서도
ProjectTemplatePlugin이 중복 import되어 SwiftLintduplicate_imports경고가 발생합니다. 하나만 남겨 주세요.import ProjectDescription import DependencyPlugin -import ProjectTemplatePlugin import ProjectTemplatePlugin import DependencyPackagePluginMultiModuleTemplate.xcworkspace/contents.xcworkspacedata (2)
89-158: tuist-derived 종속 프로젝트를 워크스페이스에 고정 참조하는 것은 취약합니다.
Tuist/.build/tuist-derived/...경로는 CI/개발 환경마다 달라질 수 있어 재현성과 캐시 안정성을 해칩니다. 일반적으로 Tuist가 생성하는 워크스페이스는 소스 프로젝트만 참조하고, 파생 산출물은 재생성하도록 두는 편이 안전합니다. 이 경로 고정을 제거하거나 Tuist 생성 산출물만 커밋/재생성 플로우를 재확인해 주세요.
82-83: 그룹/프로젝트 명명 “Utill” 오타 가능성“Utill” → 보통 “Util” 혹은 “Utilities”를 사용합니다. 검색/탐색 시 혼선을 줄이기 위해 표기 통일을 권장합니다.
Projects/Core/Network/Foundations/Foundations.xcodeproj/project.pbxproj (1)
446-472: 배포 타깃 16.6 하향 반영 확인 및 Swift 버전 정책 정리 권장해당 타깃도 16.6으로 하향되었습니다. 상위 레이어에서 호출하는 API의 가용성 및 Swift 5/6 혼재 정책을 문서화해 주세요. 향후 마이그레이션 비용 절감에 도움이 됩니다.
Also applies to: 486-511, 523-545
Projects/Shared/DesignSystem/Sources/Font/PretendardFontFamily.swift (1)
10-19: 문자열 매핑 단순화 제안
CustomStringConvertible대신 RawRepresentable(String) + CaseIterable을 쓰면 보일러플레이트가 줄고, 직렬화/테스트가 편해집니다.-public enum PretendardFontFamily: CustomStringConvertible { - case black, bold, extraBold, extraLight, light, medium, regular, semiBold, thin - public var description: String { ... } -} +public enum PretendardFontFamily: String, CaseIterable { + case black = "Black" + case bold = "Bold" + case extraBold = "ExtraBold" + case extraLight = "ExtraLight" + case light = "Light" + case medium = "Medium" + case regular = "Regular" + case semiBold = "SemiBold" + case thin = "Thin" +}Also applies to: 21-43
Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift (2)
15-16: Dynamic Type 비활성화 우려
fixedSize는 동적 글꼴 크기(Accessibility)를 우회합니다. 특별한 이유가 없다면size:사용 또는 환경에 따른 스케일 반영을 권장합니다.- return content.font(.custom("PretendardVariable-\(family)", fixedSize: size)) + return content.font(.custom("PretendardVariable-\(family)", size: size))
19-23: 편의 View 확장 복구 제안모듈 소비자 입장에선
.pretendardFont(...)가 가장 사용성이 좋습니다. 주석을 해제하고 public로 노출하는 것을 권장합니다.-// extension View { -// func pretendardFont(family: PretendardFontFamily, size: CGFloat) -> some View { -// return self.modifier(PretendardFont(family: family, size: size)) -// } -//} +public extension View { + func pretendardFont(family: PretendardFontFamily, size: CGFloat) -> some View { + modifier(PretendardFont(family: family, size: size)) + } +}Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemProd.swift (1)
44-47: 이미지 미로딩 시 fatalError는 런타임 크래시로 이어집니다파이프라인/런타임 안전성을 위해 Debug에서는
assertionFailure, Release에서는 안전 폴백(플레이스홀더 이미지)로 처리하는 방안을 고려해 보세요. 단, Tuist 생성 파일이면 생성 규칙 쪽에서 조정해야 합니다.Projects/App/MusicBandscape.xcodeproj/project.pbxproj (1)
1361-1370: Swift 6(앱) vs Swift 5(하위 모듈) 혼재혼재 자체는 가능하지만, 경고/동시성 체크 기준 상이로 인한 빌드 품질 편차가 있을 수 있습니다. 핵심 모듈 기준으로 Swift 버전 정책(6.0 권장/최소 5.9 등)을 정의하고 점진 정렬을 제안합니다.
Also applies to: 2168-2173, 2480-2481
Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemDebug.swift (1)
45-47: fatalError 처리런타임 크래시 대신 디버그에서만 assert, 릴리스에서는 플레이스홀더 반환 고려 가능. 선택 사항입니다.
Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj (1)
612-615: 테스트 번들에 3rd‑party 리소스 번들 포함
PresentationTests리소스에 Alamofire, TCA, Sharing 번들이 복사됩니다. 테스트에서 실제 필요하지 않으면 제거해 테스트 타깃 크기와 빌드 시간을 줄이세요.Projects/Presentation/Presentation/Project.swift (1)
5-5: 중복 import 제거
import ProjectTemplatePlugin가 중복입니다. 하나만 남기세요.-import ProjectTemplatePlugin import ProjectTemplatePluginProjects/App/Sources/Application/MusicBandscapeApp.swift (1)
16-18: 불필요한 빈 초기화 메서드 제거빈
init()메서드는 실제로 아무 작업도 수행하지 않으므로 제거하는 것이 좋습니다.다음 diff를 적용하여 제거하세요:
- init() { - - } -Projects/App/Sources/Di/DIRegistry.swift (1)
21-24:asyncForEach의존성 제거 또는 존재 확인 필요.프로젝트 전역에
asyncForEach확장이 없다면 컴파일 실패합니다. 단순 for‑in이 충분합니다.- await repositories.asyncForEach { module in - await module.register() - } + for module in repositories { + await module.register() + }- await useCases.asyncForEach { module in - await module.register() - } + for module in useCases { + await module.register() + }Also applies to: 33-36
Projects/App/Sources/Reducer/AppReducer.swift (1)
82-86: 지연 네비게이션 효과에 취소가 없어 중복 전송/레이스가 발생할 수 있습니다.화면 이탈/재진입 시 안전하게 취소 가능하도록 cancellation을 추가하세요. 메인 전환 미구현이라면 임시로 효과 자체를 비활성화하세요.
취소 추가 예:
- return .run { send in + return .run { send in try await clock.sleep(for: .seconds(1)) await send(.view(.presentMain), animation: .easeOut) - } + } + .cancellable(id: "splash.presentMain", cancelInFlight: true)메인 미구현 시 임시 비활성화:
- return .run { send in - try await clock.sleep(for: .seconds(1)) - await send(.view(.presentMain), animation: .easeOut) - } + return .none // TODO: Main 연결 전까지 자동 네비게이션 비활성화Projects/Presentation/Splash/Sources/View/SplashView.swift (1)
100-108: 하드코딩된 연도를 동적으로 표시하세요.빌드/출시 연도 변화에 대응하도록 동적으로 생성하는 것이 안전합니다.
- Text("© 2025 Bandscape") + Text("© \(Calendar.current.component(.year, from: Date())) Bandscape")Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift (2)
116-134: 애니메이션 타이밍을 테스트 가능하도록 리팩토링하는 것을 고려하세요.애니메이션 시퀀스의 타이밍 값들(300ms, 200ms, 300ms, 2초)이 하드코딩되어 있어 테스트 시 전체 시퀀스를 기다려야 합니다. 타이밍 값들을 별도 상수로 추출하거나 의존성으로 주입하면 테스트 시 즉시 완료되도록 할 수 있습니다.
예시:
private enum AnimationTiming { static let logoDelay: Duration = .milliseconds(300) static let textDelay: Duration = .milliseconds(200) static let subtitleDelay: Duration = .milliseconds(300) static let completionDelay: Duration = .seconds(2) }테스트에서는
TestClock을 사용하여 시간을 제어할 수 있습니다.
63-63: 애니메이션 취소 처리를 추가하는 것을 고려하세요.
CancelID.animation을 정의했지만, 사용자가 스플래시 화면을 떠날 때 애니메이션을 명시적으로 취소하는 로직이 없습니다. View가 사라질 때(onDisappear 등) 애니메이션을 취소하는 것을 고려하세요.예시:
case .view(.onDisappear): return .cancel(id: CancelID.animation)
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/splashLogo.imageset/SplashLogo.svgis excluded by!**/*.svg
📒 Files selected for processing (69)
.coderabbit.yaml(1 hunks)MultiModuleTemplate.xcworkspace/contents.xcworkspacedata(1 hunks)MultiModuleTemplate.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings(1 hunks)Plugins/DependencyPlugin/ProjectDescriptionHelpers/TargetDependency+Module/Modules.swift(1 hunks)Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Enviorment.swift(1 hunks)Projects/App/MusicBandscape.xcodeproj/project.pbxproj(43 hunks)Projects/App/Sources/Application/AppDelegate.swift(1 hunks)Projects/App/Sources/Application/MusicBandscapeApp.swift(1 hunks)Projects/App/Sources/Di/DIRegistry.swift(1 hunks)Projects/App/Sources/Di/Extension+AppDIContainer.swift(1 hunks)Projects/App/Sources/Reducer/AppReducer.swift(1 hunks)Projects/App/Sources/View/AppView.swift(1 hunks)Projects/App/Sources/View/ContentView.swift(2 hunks)Projects/Core/Core/Core.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Data/API/API.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Data/DataInterface/DataInterface.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Data/Model/Model.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Data/Repository/Repository.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Data/Service/Service.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Domain/DomainInterface/DomainInterface.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Domain/Entity/Entity.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Domain/UseCase/UseCase.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Network/Foundations/Foundations.xcodeproj/project.pbxproj(10 hunks)Projects/Core/Network/Networking/Networking.xcodeproj/project.pbxproj(10 hunks)Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj(21 hunks)Projects/Presentation/Presentation/Project.swift(1 hunks)Projects/Presentation/Presentation/Sources/Exported/PresentationExported.swift(1 hunks)Projects/Presentation/Splash/Derived/InfoPlists/Splash-Debug-Info.plist(1 hunks)Projects/Presentation/Splash/Derived/InfoPlists/Splash-Info.plist(1 hunks)Projects/Presentation/Splash/Derived/InfoPlists/Splash-Prod-Info.plist(1 hunks)Projects/Presentation/Splash/Derived/InfoPlists/Splash-Stage-Info.plist(1 hunks)Projects/Presentation/Splash/Derived/InfoPlists/SplashTests-Info.plist(1 hunks)Projects/Presentation/Splash/Project.swift(1 hunks)Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift(1 hunks)Projects/Presentation/Splash/Sources/View/SplashView.swift(1 hunks)Projects/Presentation/Splash/Splash.xcodeproj/project.pbxproj(1 hunks)Projects/Presentation/Splash/Splash.xcodeproj/project.xcworkspace/contents.xcworkspacedata(1 hunks)Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash-Debug.xcscheme(3 hunks)Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash-Prod.xcscheme(3 hunks)Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash-Stage.xcscheme(3 hunks)Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash.xcscheme(4 hunks)Projects/Presentation/Splash/SplashTests/Sources/Test.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemDebug.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemProd.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemStage.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystem.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystemDebug.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystemProd.swift(1 hunks)Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystemStage.swift(1 hunks)Projects/Shared/DesignSystem/DesignSystem.xcodeproj/project.pbxproj(21 hunks)Projects/Shared/DesignSystem/Project.swift(1 hunks)Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/Contents.json(1 hunks)Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/splashLogo.imageset/Contents.json(1 hunks)Projects/Shared/DesignSystem/Sources/Base.swift(0 hunks)Projects/Shared/DesignSystem/Sources/Color/Colors.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Color/Extension+Color.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Font/PretendardFontFamily.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Image/Extension+Image.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift(1 hunks)Projects/Shared/Shared/Shared.xcodeproj/project.pbxproj(28 hunks)Projects/Shared/Shared/Sources/Base.swift(0 hunks)Projects/Shared/Shared/Sources/Exorted/SharedExported.swift(1 hunks)Projects/Shared/ThirdParty/Project.swift(1 hunks)Projects/Shared/ThirdParty/ThirdParty.xcodeproj/project.pbxproj(26 hunks)Projects/Shared/Utill/Utill.xcodeproj/project.pbxproj(10 hunks)Tuist/Package.resolved(3 hunks)Tuist/Package.swift(1 hunks)
💤 Files with no reviewable changes (2)
- Projects/Shared/Shared/Sources/Base.swift
- Projects/Shared/DesignSystem/Sources/Base.swift
🧰 Additional context used
🧬 Code graph analysis (2)
Projects/App/Sources/Application/AppDelegate.swift (1)
Projects/App/Sources/Di/Extension+AppDIContainer.swift (1)
registerDefaultDependencies(11-19)
Projects/Presentation/Splash/Sources/View/SplashView.swift (1)
Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift (2)
body(14-16)pretendardFont(33-36)
🪛 SwiftLint (0.57.0)
Projects/Presentation/Splash/Project.swift
[Warning] 5-5: Imports should be unique
(duplicate_imports)
Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift
[Warning] 39-39: MARK comment should be in valid format. e.g. '// MARK: ...' or '// MARK: - ...'
(mark)
[Warning] 47-47: MARK comment should be in valid format. e.g. '// MARK: ...' or '// MARK: - ...'
(mark)
[Warning] 56-56: MARK comment should be in valid format. e.g. '// MARK: ...' or '// MARK: - ...'
(mark)
🔇 Additional comments (43)
Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/Contents.json (1)
1-6: Xcode 자산 카탈로그 구조가 올바릅니다.로고 이미지 자산을 위한 표준 컨테이너 파일로 적절하게 구성되었습니다.
Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/splashLogo.imageset/Contents.json (1)
1-12: SVG 형식 및 파일 검증 완료
SplashLogo.svg파일이 올바른 위치에 존재하는 것을 확인했습니다. iOS 16.6 타겟 프로젝트에서 SVG 형식은 완벽하게 지원되며,Contents.json구조도 정확하게 구성되어 있습니다. 추가 수정 사항이 없습니다.Plugins/ProjectTemplatePlugin/ProjectDescriptionHelpers/Project+Templete/Project+Enviorment.swift (1)
30-30: 배포 대상 변경 검증 완료 - 안전함을 확인했습니다.코드베이스에서 iOS 17+ 전용 API 사용이 감지되지 않았습니다. 모든
@available가드는 iOS 13.0 이상으로 설정되어 있으며, iOS 17 특화 가드나 프레임워크(SwiftData, ChartKit 등)도 사용 중이 아닙니다. 따라서 배포 대상을 iOS 17.0에서 16.6으로 낮추는 변경은 안전합니다.Projects/Core/Data/Service/Service.xcodeproj/project.pbxproj (1)
448-448: iOS 배포 타겟 하향 조정 - 안전성 확인 완료Service 모듈의 전체 Swift 코드를 검토한 결과, iOS 17.0+ 전용 API가 사용되지 않았으며, SwiftUI 임포트만 포함되어 있습니다. 모든 빌드 구성에서 IPHONEOS_DEPLOYMENT_TARGET이 일관되게 16.6으로 업데이트되었고, 외부 의존성에서도 iOS 17.0 이상을 요구하는 항목이 없습니다. 이 변경사항은 안전합니다.
Projects/Shared/Utill/Utill.xcodeproj/project.pbxproj (1)
442-809: 모든 타겟에서 iOS 배포 대상이 일관되게 16.6으로 업데이트되었습니다.Utill, Utill-Debug, Utill-Prod, Utill-Stage, UtillTests 모듈의 Debug와 Release 구성에서
IPHONEOS_DEPLOYMENT_TARGET이 일관되게 16.6으로 설정되었습니다. 더 넓은 iOS 기기 호환성을 제공하는 변경입니다.검증 결과:
- Utill 모듈 내 iOS 17.0+ 특화 API 사용 없음 (TipKit, SwiftData, Live Activities, UIHostingController.sizingOptions 등)
- iOS 16.6과 17.0 사이에 API 레벨 중단 변경 없음 (iOS 17.0은 주로 새 기능 추가)
- 모든 타겟과 빌드 구성에서 배포 대상이 일관성 있게 적용됨
확인 필요 사항:
프로젝트의 CocoaPods 또는 Swift Package Manager 의존성이 iOS 16.6을 지원하는지 수동으로 확인하세요. 특히 Podfile이 있다면platform :ios, '16.6'로 설정되어 있고, 모든 pod의s.ios.deployment_target또는platform :ios가 16.6 이하로 지정되어 있는지 검토해 주세요.Projects/Shared/Shared/Sources/Exorted/SharedExported.swift (1)
8-9: 검증 결과: 원래 리뷰 의견 중 일부가 부정확합니다.검증을 통해 다음을 확인했습니다:
Utill은 오타가 아닙니다 — 프로젝트 구조에서 실제 모듈 이름이Utill입니다 (Projects/Shared/Utill/디렉토리 확인됨). 원래 리뷰의 이 부분은 제거해야 합니다.
Exorted는 실제 오타입니다 — 코드베이스의 다른 부분에서는Exported라는 이름을 사용합니다 (Projects/Core/Core/Sources/Exported/,Projects/Presentation/Presentation/Sources/Exported/). 디렉토리와 파일 경로를Exported로 수정해야 합니다.
@_exported사용 — 언더스코어 기능의 안정성에 대한 우려는 여전히 유효하지만, 프로젝트의 의도를 확인해야 합니다.실행 항목:
Projects/Shared/Shared/Sources/Exorted/디렉토리를Projects/Shared/Shared/Sources/Exported/로 이름 변경- 이 경로의 모든 파일과 import 문 업데이트
@_exported사용 의도 재검토Likely an incorrect or invalid review comment.
Projects/Shared/Shared/Shared.xcodeproj/project.pbxproj (1)
897-897: 배포 타겟 변경은 안전합니다.종합 검증 결과, 코드베이스에서 iOS 17+ API나 버전 확인이 전혀 없는 것으로 확인되었습니다. 모든
@available주석은 iOS 13.0 이상의 낮은 버전을 대상으로 하며, SwiftData, WeatherKit 등 iOS 17 고유 프레임워크도 사용되지 않습니다. 따라서 배포 타겟을 17.0에서 16.6으로 낮추는 것은 런타임 호환성 문제를 야기하지 않습니다.Projects/Shared/ThirdParty/ThirdParty.xcodeproj/project.pbxproj (1)
285-312: 불필요한 프레임워크 링크 제거 검토검증 결과 ThirdParty 타겟의 유일한 소스 파일 Base.swift는 SwiftUI만 import하여 간단한 BaseView를 정의합니다. 그러나 pbxproj의 Frameworks 단계(285-312줄)에는 Alamofire, Moya, AsyncMoya, RxSwift, RxMoya, CombineMoya, CFNetwork 등 28개 프레임워크가 링크되어 있습니다.
Base.swift에서 이들 프레임워크가 직접 사용되지 않으므로, ThirdParty의 설계 목적(라이브러리 aggregator, umbrella 프레임워크 등)을 확인한 후 불필요한 링크를 정리하는 것이 빌드 성능과 유지보수성에 유리합니다.
Tuist/Package.resolved (1)
14-21: AsyncMoya 1.1.6 해상 확인됨, 반응형 라이브러리는 전이 종속성
- AsyncMoya는 Package.resolved에서 1.1.6으로 올바르게 해상되었습니다. Package.swift에서 현재
from: "1.1.5"로 선언되어 있으므로, 재현성을 위해from: "1.1.6"으로 정확히 핀할 수 있습니다(선택사항).- RxSwift 6.9.0과 ReactiveSwift 6.7.0은 전이 종속성(AsyncMoya 또는 다른 의존성을 통해 간접 포함)으로, 코드베이스에서 직접 사용되지 않습니다. 이들을 제거하려면 상위 의존성을 변경해야 하므로 로컬 변경만으로는 제거 불가능합니다.
Projects/Presentation/Splash/Derived/InfoPlists/Splash-Prod-Info.plist (1)
7-8: LGTM! 프레임워크 설정이 올바릅니다.Splash 모듈을 프레임워크로 구성하기 위한 표준 Info.plist 설정입니다. CFBundleExecutable과 CFBundlePackageType 변경이 적절합니다.
Also applies to: 16-16
Projects/Shared/DesignSystem/Project.swift (1)
11-11: 정적 프레임워크에서 동적 프레임워크로의 변경을 확인해주세요.DesignSystem 모듈의 product 타입이
.staticFramework에서.framework(동적 프레임워크)로 변경되었습니다. 이 변경은 다음과 같은 영향을 미칩니다:
- 앱 시작 시간에 영향 (동적 링킹 오버헤드)
- 빌드 시간 및 앱 크기에 영향
- 다른 모듈들과의 일관성
이 변경이 의도적이며 프로젝트의 모듈화 전략과 일치하는지 확인해주세요.
Projects/Presentation/Splash/Derived/InfoPlists/Splash-Debug-Info.plist (1)
7-8: LGTM! Debug 환경 설정이 올바릅니다.Prod 환경과 일관되게 프레임워크 설정이 적용되었습니다.
Also applies to: 16-16
Projects/Presentation/Splash/Splash.xcodeproj/project.xcworkspace/contents.xcworkspacedata (1)
1-7: LGTM! 표준 워크스페이스 파일입니다.Splash 모듈을 위한 표준 Xcode 워크스페이스 구성 파일입니다.
Projects/App/Sources/View/ContentView.swift (1)
2-4: LGTM! Import 구문이 적절합니다.Preview를 위한 필요한 모듈들이 올바르게 import되었습니다.
Projects/Presentation/Presentation/Sources/Exported/PresentationExported.swift (1)
10-10: 리뷰 의견이 잘못되었습니다. 재검토가 필요합니다.코드 검증 결과:
- Presentation 모듈의 현재 의존성:
.Presentation(implements: .Splash)만 존재- Service는 Presentation의 의존성으로 포함된 적이 없습니다
- Service는 Projects/Core/Data/Service/ 에 존재하는 별도의 Data 레이어 모듈입니다
- PresentationExported.swift는 현재 Splash만 export하고 있으며, 이는 정상입니다
Service 모듈은 Presentation을 통해 re-export되지 않았으므로, 이 변경은 breaking change를 야기하지 않습니다.
Likely an incorrect or invalid review comment.
MultiModuleTemplate.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (1)
5-6: LGTM워크스페이스 컨텍스트 자동 생성 비활성화 설정 적절합니다.
Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift (1)
25-37: 폰트 리소스명 검증 권고
"PretendardVariable-\(family)"가 실제 번들 등록(PostScript name/UIAppFonts)과 일치하는지 확인해 주세요. 불일치 시 SwiftUI는 시스템 폰트로 폴백됩니다. 빌드 타임 확인(유닛 테스트/런치 어설션) 도입을 권장합니다.Projects/App/MusicBandscape.xcodeproj/project.pbxproj (2)
1148-1172: 매크로 플러그인 경로가Debug로 고정되어 있습니다
OTHER_SWIFT_FLAGS의-load-plugin-executable "$BUILD_DIR/Debug$EFFECTIVE_PLATFORM_NAME/..."가 Prod/Release/Stage에도 동일하게 들어가 있습니다. 구성(Release 등)에서 플러그인 바이너리 경로가 달라 빌드 실패할 수 있으니, Tuist 설정 혹은 Xcode 설정에서 구성별 변수로 치환되는지 확인 바랍니다.Also applies to: 1199-1226, 1253-1284
1144-1145: 배포 타깃 16.6 하향에 따른 상용/스테이지 전 구성 동작 확인외부 서드파티(예: TCA, SwiftUINavigation, RxSwift 등) 최소 지원 버전과의 호환성을 최종 빌드(Release)로도 확인해 주세요.
Also applies to: 1198-1199, 1256-1257, 1497-1498, 1555-1556, 1613-1614, 167-168
Projects/Core/Data/Model/Model.xcodeproj/project.pbxproj (1)
448-469: <!-- [scratchpad_update]
[observations_added]
- iOS 17 deprecated APIs identified: traitCollectionDidChange (UIKit), scrollPosition (SwiftUI), and others
- iOS 17 new APIs: SwiftData, TipKit, SF Symbols animations, Observable macro, trait registration APIs
- Deployment target 16.6 is BELOW iOS 17, so iOS 17-only APIs should not be used without @available guards
- Script search found NO iOS 17+ specific @available markers—only iOS 13.0, iOS 11.0, etc.
- Current codebase appears compliant for iOS 16.6 deployment target
[analysis_update]
- Review concern about iOS 17+ API usage appears unfounded based on both script results
- The codebase does not appear to be using iOS 17+ exclusive features without guards
- However, need to verify Swift version issue (5.0 vs 6.0) and any build warnings
- The key issue is not about iOS 17 APIs but Swift version compatibility
[pending_continued]
- Check if there are any uses of iOS 17+ deprecated APIs that need @available guards
- Verify actual Swift version and compilation target compatibility issues
- Search for usage patterns that might indicate iOS 17+ API usage
[scratchpad_end] --><!-- [scratchpad_update]
[observations_continued]
- Swift 6 introduces strict concurrency checking by default (SE-0337: StrictConcurrency)
- Swift 5 can enable strict concurrency as opt-in with -warn-concurrency flag
- Swift 5 and Swift 6 can coexist in modules but with caveats
- Mixed Swift versions possible but strict concurrency differences can cause increased warnings
- Swift 6 is NOT forward compatible: libraries built with Swift 6 won't work with Swift 5 consumers
- However, backwards compatibility is fine: Swift 5 libraries work with Swift 6 consumers
[analysis_continued]
- Review concern about Swift version mismatch (Model=5.0, App=6.0) is legitimate
- The concern about warnings increasing due to strict concurrency checking is valid
- However, iOS 17+ API concern appears unfounded based on script search results
- Need to verify if Model target actually uses Swift 5.0 or if there's an error in the review
[actions_update]
Check the actual Model target pbxproj configuration to confirm Swift version
[scratchpad_end] -->Now I need to verify the actual configurations mentioned in the review comment to see if they are accurate:<!-- [scratchpad_update]
[observations_final]
- iOS 16.6 is a valid deployment target (between iOS 16.0 and iOS 17)
- Deployment target 16.6 means the app supports iOS 16.6 and above
- No iOS 17+ APIs should be used without @available guards
- Script search confirmed NO iOS 17+ specific APIs are being used in the codebase
- All @available markers found are for iOS 13.0, iOS 11.0 (well below 16.6)
- Swift version mismatch (5.0 vs 6.0) is a legitimate concern with strict concurrency
- Review concern about iOS 17+ APIs appears completely unfounded
- The deployment target lowering to 16.6 itself is not problematic
- The real issue is Swift version management and strict concurrency
[final_analysis]
- iOS 17+ API concern: NOT supported by evidence. No iOS 17+ APIs found in code.
- Deployment target 16.6: Valid and safe. All existing APIs are compatible with this target.
- Swift version mismatch: Valid concern IF the App target is using Swift 6.0 while Model uses 5.0.
- Guard concern: Existing @available guards are appropriate for iOS 13.0+, not iOS 17+.
[conclusion]
The review comment is partially incorrect. The iOS 17+ API guard concern appears unfounded based on the script results. The deployment target lowering to 16.6 itself is not problematic. The actual concern should focus on Swift version compatibility (5.0 vs 6.0) and strict concurrency checking differences if applicable.
[scratchpad_end] -->iOS 17+ API 가드 점검 결과: 해당 사항 없음
제공된 스크립트 결과에 따르면 프로젝트 내
@available마크는 모두 iOS 13.0, iOS 11.0 등으로 표시되어 있으며, iOS 17 이상 전용 API는 발견되지 않았습니다. 배포 타깃 16.6 하향에 따른 iOS 17+ API 호환성 문제는 현재 코드베이스에서는 확인되지 않습니다.다만, Swift 버전 혼합(Model: 5.0 vs App: 6.0)으로 인한 엄격 동시성 체크 차이는 여전히 관심 있는 사항입니다. 가능하면 핵심 모듈 간 Swift 버전 정책을 정렬하고, 빌드 시 발생하는 동시성 관련 경고를 모니터링하시기 바랍니다.
Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemDebug.swift (1)
51-55: SwiftUI 브릿지 구현 적절가용성 주석 및 번들 지정이 올바릅니다. 변경사항 승인합니다.
Also applies to: 61-74
Projects/Shared/DesignSystem/DesignSystem.xcodeproj/project.pbxproj (1)
198-204: 소스 그룹화와 리소스 구성은 명확함Color/Font/Image 모듈 구성과 파일 참조가 일관됩니다. 변경사항 승인합니다.
Also applies to: 224-232, 279-287, 315-323
Projects/Presentation/Splash/Derived/InfoPlists/Splash-Info.plist (1)
7-8: 프레임워크 패키지 타입 전환 적절
CFBundleExecutable추가 및CFBundlePackageType=FMWK전환이 새 프레임워크 타깃에 맞게 올바릅니다.Also applies to: 16-16
Projects/Presentation/Presentation/Project.swift (1)
14-15: Splash 의존성 및 splashLogo 자산 검증 완료프레젠테이션 모듈의 Splash 구현 의존성 재배치가 올바르게 구성되었습니다. 요청하신 splashLogo 자산 존재 여부 확인 결과, 자산이 정상적으로 존재하며 코드에서 올바르게 참조되고 있음을 확인했습니다:
- 자산 위치:
Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/splashLogo.imageset- 자산 파일:
SplashLogo.svg✓- 사용 위치:
Projects/Presentation/Splash/Sources/View/SplashView.swift:65코드 변경사항이 적절히 구현되었습니다.
Projects/App/Sources/Di/Extension+AppDIContainer.swift (1)
10-19: LGTM!DI 컨테이너 확장이 올바르게 구현되었습니다.
@DIContainerActor를 사용한 비동기 패턴이 적절하며, 모듈 팩토리를 통한 의존성 등록 구조도 깔끔합니다.Projects/Shared/DesignSystem/Sources/Image/ImageAsset.swift (1)
10-15: LGTM!이미지 애셋을 위한 타입 안전한 열거형이 잘 구현되었습니다. 이 패턴은 문자열 하드코딩을 방지하고 컴파일 타임에 오타를 잡을 수 있어 좋습니다.
Projects/App/Sources/Application/AppDelegate.swift (1)
16-18: 앱 아키텍처 불일치로 인한 리뷰 의견 재검토 필요코드 검증 결과, 이 리뷰 의견은 실제 앱 구조와 맞지 않습니다:
- @injected 사용 없음: 전체 코드베이스에서 @injected 속성이 0개입니다. 리뷰는 이를 전제로 하고 있습니다.
- Container.resolve() 호출 없음: WeaveDI 컨테이너에서 의존성을 해결하는 코드가 없습니다.
- TCA 아키텍처: 앱은 The Composable Architecture(TCA)를 사용하므로, Store 패턴으로 의존성을 관리합니다. AppView와 모든 뷰는 TCA Store를 통해 의존성을 받습니다.
- 미사용 DI 설정: WeaveDI 부트스트랩은 실행되지만, 실제 코드에서 호출되지 않습니다.
따라서 리뷰에서 언급한 "@injected가 DI 초기화 전에 해결되려고 시도하는 레이스 컨디션"은 이 코드베이스에서는 발생하지 않습니다.
Likely an incorrect or invalid review comment.
Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash-Prod.xcscheme (1)
17-20: LGTM - 스킴 참조가 올바르게 업데이트됨BuildableReference가 DesignSystem에서 Splash 모듈로 일관되게 업데이트되었으며, 모든 빌드 액션에서 올바르게 참조되고 있습니다.
Also applies to: 47-50, 63-66
Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash-Stage.xcscheme (1)
17-20: LGTM - Stage 스킴 설정이 올바름Splash-Stage 타겟에 대한 BuildableReference가 모든 빌드 단계에서 일관되게 구성되어 있습니다.
Also applies to: 47-50, 63-66
Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash-Debug.xcscheme (1)
17-20: LGTM - Debug 스킴 구성이 적절함Splash-Debug 타겟으로의 참조가 모든 액션에서 올바르게 설정되어 있습니다.
Also applies to: 47-50, 63-66
Projects/Presentation/Splash/Derived/InfoPlists/Splash-Stage-Info.plist (1)
1-22: LGTM - 표준 프레임워크 Info.plist 구성Info.plist 파일이 프레임워크에 필요한 모든 표준 키를 포함하고 있으며, Xcode 빌드 설정 플레이스홀더를 적절하게 사용하고 있습니다.
Projects/Presentation/Splash/Splash.xcodeproj/xcshareddata/xcschemes/Splash.xcscheme (2)
17-20: LGTM - 스킴 마이그레이션이 올바르게 완료됨DesignSystem에서 Splash로의 스킴 참조 마이그레이션이 모든 빌드 액션에서 일관되게 적용되었습니다.
Also applies to: 57-60, 73-76
31-41: 테스트 타겟 추가가 적절함SplashTests.xctest가 TestableReference로 올바르게 추가되었으며, 테스트 실행 설정이 적절합니다.
Projects/Shared/DesignSystem/Sources/Color/Colors.swift (1)
10-20: 색상 팔레트 정의 구조는 양호함ShapeStyle 확장을 통한 색상 토큰 정의는 SwiftUI 모범 사례를 따르고 있으며, 디자인 시스템 전반에서 일관된 색상 사용을 가능하게 합니다.
Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystem.swift (2)
11-15: LGTM - 번들 접근자 리팩토링이 적절함프레임워크 기반 아키텍처에 맞게 번들 해석 방식이 단순화되었습니다.
BundleFinder클래스를 사용한 직접 번들 초기화는 동적 프레임워크에서 표준적인 패턴입니다.
18-23: Objective-C 호환성 추가가 유용함
DesignSystemResources클래스를 통한 공개 번들 접근자는 Objective-C 코드와의 상호 운용성을 제공하여 좋은 추가 기능입니다.Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystemStage.swift (1)
14-16: Bundle 해석 방식 OK, 변형 타깃 간 중복 선언만 확인 부탁드립니다.
Bundle(for:)로의 단순화와 ObjC용DesignSystemStageResources.bundle노출은 합리적입니다. 다만 동일 타깃(모듈) 안에extension Bundle { static let module ... }가 여러 파일에서 중복 선언되면 재정의 에러가 납니다. 현재 이 파일은 DesignSystemStage 전용인지, 그리고 Debug/Prod/DesignSystem 변형은 각각 별도 타깃인지 확인 부탁드립니다. 또한 정적 프레임워크/테스트 번들 환경에서도 자원이 기대한 번들에서 로드되는지 간단한 스냅샷 테스트를 권장합니다.Also applies to: 18-23
Projects/Shared/DesignSystem/Derived/Sources/TuistBundle+DesignSystemProd.swift (1)
11-23: 번들 접근 방식이 적절하게 단순화되었습니다.직접
Bundle(for: BundleFinder.self)방식으로 변경하고 Objective-C 브리징을 위한DesignSystemProdResources클래스를 추가한 것은 다른 DesignSystem 모듈들과 일관성 있는 패턴입니다.Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift (1)
19-29: State 프로퍼티들이 잘 구성되어 있습니다.애니메이션 상태를 추적하기 위한 프로퍼티들이 명확하게 정의되어 있고,
@ObservableState를 적절하게 사용하고 있습니다. 초기값들도 애니메이션 시작 상태로 적절하게 설정되어 있습니다.Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystemStage.swift (2)
20-22: splashLogo 에셋이 추가되었습니다.새로운 스플래시 로고 에셋이 DesignSystemStageAsset에 추가되었습니다. Tuist에 의해 자동 생성된 코드로 패턴이 적절합니다.
44-46: 검증 완료: splashLogo 에셋이 존재합니다.
./Projects/Shared/DesignSystem/Resources/ImageAssets.xcassets/Logo/splashLogo.imageset/에서 에셋이 확인되었습니다. fatalError 패턴은 Tuist가 생성하는 표준 패턴이며, 에셋이 Bundle에 포함되어 있으므로 프로덕션 환경에서 크래시 위험은 없습니다.Projects/Shared/DesignSystem/Derived/Sources/TuistAssets+DesignSystem.swift (2)
20-22: splashLogo 에셋이 메인 DesignSystem에 추가되었습니다.DesignSystemAsset에 새로운 스플래시 로고 에셋이 추가되었습니다. Stage, Prod 등 다른 환경 변형들과 일관성 있게 구현되어 있습니다.
26-56: 플랫폼별 이미지 로딩이 올바르게 구현되었습니다.
DesignSystemImages구조체가 macOS, iOS, tvOS, watchOS, visionOS를 모두 지원하며, SwiftUI와의 통합도 적절하게 구현되어 있습니다. Tuist에 의해 생성된 표준 패턴입니다.
| await AppDIManager.shared.registerDefaultDependencies() | ||
| } | ||
|
|
||
| isPerceptionCheckingEnabled = false |
There was a problem hiding this comment.
Perception 체크 비활성화 이유 설명 추가 필요
isPerceptionCheckingEnabled를 전역적으로 비활성화하고 있습니다. 이는 ComposableArchitecture의 상태 관리 버그를 숨길 수 있습니다. 비활성화가 필요한 명확한 이유를 주석으로 추가하거나, 프로덕션 빌드에서만 비활성화하는 것을 고려하세요.
다음 diff를 적용하여 조건부로 비활성화하거나 설명을 추가하세요:
+ // TODO: Perception checking은 개발 중 상태 관리 이슈를 감지합니다.
+ // 프로덕션에서만 비활성화하는 것을 고려하세요.
+ #if !DEBUG
isPerceptionCheckingEnabled = false
+ #endif📝 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.
| isPerceptionCheckingEnabled = false | |
| // TODO: Perception checking은 개발 중 상태 관리 이슈를 감지합니다. | |
| // 프로덕션에서만 비활성화하는 것을 고려하세요. | |
| #if !DEBUG | |
| isPerceptionCheckingEnabled = false | |
| #endif |
🤖 Prompt for AI Agents
In Projects/App/Sources/Application/AppDelegate.swift around line 20, currently
isPerceptionCheckingEnabled is unconditionally set to false; add a short comment
above that line explaining the exact reason this global flag must be disabled
(what bug it works around and any tracking/ticket reference), and change the
assignment to be conditional so it only disables in production builds (wrap the
assignment with a compilation conditional such as #if PRODUCTION /
isPerceptionCheckingEnabled = false / #endif) so the check remains enabled in
dev/debug builds for proper testing and debugging.
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check the current state of AppDelegate.swift to verify the fix
cat Projects/App/Sources/Application/AppDelegate.swift
Length of output: 532
@Roy-wonji 확인했습니다! 👍
isPerceptionCheckingEnabled = false를 #if !DEBUG 조건으로 감싸서 프로덕션 빌드에서만 비활성화하도록 수정하셨네요. 이제 개발/디버그 빌드에서는 Perception 체킹이 활성화되어 있어서 상태 관리 이슈를 제대로 감지할 수 있습니다.
수정 잘 하셨습니다! ✨
|
|
||
| /// 모든 의존성을 자동으로 등록하는 레지스트리 | ||
| extension WeaveDI.Container { | ||
| private static let helper = RegisterModule() |
There was a problem hiding this comment.
미사용 정적 프로퍼티로는 사이드이펙트를 보장할 수 없습니다.
helper가 모듈 자동등록 트리거라면 최적화에서 제거될 수 있습니다. 각 등록 함수 시작부에서 명시적으로 참조하세요.
다음과 같이 보완을 권장합니다:
static func registerRepositories() async {
+ _ = helper // 모듈 등록 보장 static func registerUseCases() async {
+ _ = helper // 모듈 등록 보장Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In Projects/App/Sources/Di/DIRegistry.swift around line 13, the static property
"helper" is currently declared but never directly referenced, so the optimizer
may strip it and its side-effect (module auto-registration) will not be
guaranteed; update each public registration entrypoint (every register...()
function) to explicitly reference the helper at the start (e.g., read or call a
harmless member) so the compiler cannot remove it, or alternatively replace the
pattern with an explicit initialization call invoked from each registration
function to ensure the module registration side-effect always runs.
There was a problem hiding this comment.
@Roy-wonji, 알겠습니다! 나중에 추가하시는 것으로 이해했습니다.
이 내용을 추적하기 위해 GitHub 이슈를 생성해 드릴까요? 이슈를 만들어두면 나중에 작업하실 때 참고하시기 편하실 것 같습니다.
| case .presentMain: | ||
| // state = .mainTab(.init()) | ||
| // return .send(.scope(.mainTab(.scope(.movieCoordinator)))) | ||
| return .none | ||
| } |
There was a problem hiding this comment.
.presentMain 처리에 상태 전환이 없어 화면 전환이 이루어지지 않습니다.
현재 .view(.presentMain)은 .none만 반환합니다. 메인 화면이 아직 없다면 자동 네비게이션을 끄고, 존재한다면 상태 전환을 구현하세요.
옵션 A(메인 미구현: 임시 비활성화):
- case .presentMain:
-// state = .mainTab(.init())
-// return .send(.scope(.mainTab(.scope(.movieCoordinator))))
- return .none
+ case .presentMain:
+ // TODO: Main 탭 연결 시 상태 전환 구현
+ return .none옵션 B(메인 구현됨: 상태 전환 활성화):
case .presentMain:
- return .none
+ state = .mainTab(.init())
+ return .none🤖 Prompt for AI Agents
In Projects/App/Sources/Reducer/AppReducer.swift around lines 69 to 73, the
.presentMain case currently returns .none so no navigation/state transition
happens; implement one of two fixes: Option A — explicitly mark main as disabled
by setting state to a disabled/placeholder main state (e.g., set state =
.mainTab(nil or .init(disabled: true))) and return .none to keep navigation off;
Option B — enable the main flow by performing the proper state transition and
effect, e.g., set state = .mainTab(.init()) and return the appropriate effect to
scope into the main coordinator (e.g.,
.send(.scope(.mainTab(.scope(.movieCoordinator))))) so the main screen is
presented; choose the option matching whether main is implemented and update the
.presentMain branch accordingly.
There was a problem hiding this comment.
아직 구현 안해서 적용은 안했으
There was a problem hiding this comment.
@Roy-wonji 네, 이해했습니다! MainTabFeature 구현 전이라면 현재 .none 반환이 적절합니다.
코드에 이미 주석으로 향후 구현 방향이 잘 표시되어 있으니, MainTabFeature가 준비되면 해당 주석을 해제하여 상태 전환을 활성화하시면 됩니다. 🙂
case .presentMain:
// MainTabFeature 구현 후 활성화
// state = .mainTab(.init())
// return .send(.scope(.mainTab(.scope(.movieCoordinator))))
return .none| E5EEB7ACB5CDE77BE537A765 /* Exorted */ = { | ||
| isa = PBXGroup; | ||
| children = ( | ||
| D18F2FC1022DACA3552A5DEB /* SharedExported.swift */, | ||
| ); | ||
| path = Exorted; | ||
| sourceTree = "<group>"; | ||
| }; |
There was a problem hiding this comment.
그룹 이름의 오타를 수정하세요.
Exorted 그룹 이름은 Exported의 오타로 보입니다. 이는 실제 파일 시스템의 디렉토리 이름과 일치하므로, 두 곳 모두 수정이 필요합니다.
🤖 Prompt for AI Agents
In Projects/Shared/Shared/Shared.xcodeproj/project.pbxproj around lines 633–640,
the PBXGroup entry uses the misspelled name/path "Exorted"; change the group
comment and the path value from "Exorted" to "Exported" (e.g., rename the
comment after the GUID and set path = Exported), then ensure the on-disk folder
is renamed to "Exported" and update any other occurrences of "Exorted" in the
.pbxproj so all references match the corrected "Exported".
There was a problem hiding this comment.
SharedExported 이건 한번에 호출 하기 위해서 만든거야
There was a problem hiding this comment.
@Roy-wonji 네, SharedExported.swift 파일의 목적은 이해했습니다! 모듈들을 한 번에 재export하기 위한 파일이군요. 👍
제가 지적한 부분은 폴더 이름 Exorted에 대한 것이었습니다. 파일 이름 SharedExported.swift는 올바른데, 이 파일이 들어있는 폴더/그룹 이름이 Exorted로 되어 있어서 Exported의 오타가 아닌가 했습니다.
하지만 의도적으로 그렇게 사용하시는 거라면 괜찮습니다! 제 코멘트는 무시하셔도 됩니다. 😊
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (16)
Projects/Shared/DesignSystem/Sources/Image/Extension+Image.swift (2)
14-22: 플랫폼 가드 일관성을 개선하면 좋겠습니다.UIKit을 조건부로 임포트했다면,
UIImage확장도 동일한 가드로 감싸는 것이 일관성 있습니다. 현재는 iOS 전용 프로젝트이므로 문제가 되지 않지만, 향후 다른 플랫폼 지원 시 도움이 됩니다.다음과 같이 수정할 수 있습니다:
+#if canImport(UIKit) public extension UIImage { convenience init?(_ asset: ImageAsset) { self.init(named: asset.rawValue, in: Bundle.module, with: nil) } convenience init?(assetName: String) { self.init(named: assetName, in: Bundle.module, with: nil) } } +#endif
24-40: 에셋 로딩 실패 시 디버깅 정보 추가를 고려해보세요.현재 에셋을 찾지 못하면 조용히 "questionmark" 시스템 이미지로 대체됩니다. 이는 크래시를 방지하지만, 에셋 이름이 잘못되었거나 누락된 경우 문제를 파악하기 어렵게 만들 수 있습니다.
개발 중 에셋 문제를 더 쉽게 발견하려면 디버그 로깅을 추가할 수 있습니다:
public extension Image { init(asset: ImageAsset) { if let uiImage = UIImage(asset) { self.init(uiImage: uiImage) } else { + #if DEBUG + print("⚠️ [DesignSystem] Failed to load image asset: \(asset.rawValue)") + #endif self = Image(systemName: "questionmark") } } init(assetName: String) { if let uiImage = UIImage(assetName: assetName) { self.init(uiImage: uiImage) } else { + #if DEBUG + print("⚠️ [DesignSystem] Failed to load image asset: \(assetName)") + #endif self = Image(systemName: "questionmark") } } }Projects/App/Sources/Reducer/AppReducer.swift (1)
82-86: 스플래시 화면 지속 시간 검토를 권장합니다.1초 딜레이는 사용자가 스플래시 화면의 디자인을 충분히 인지하기에 짧을 수 있습니다. 일반적으로 2-3초가 더 나은 UX를 제공합니다.
- try await clock.sleep(for: .seconds(1)) + try await clock.sleep(for: .seconds(2))Projects/App/Sources/Application/MusicBandscapeApp.swift (1)
16-18: 불필요한 빈 이니셜라이저입니다.Swift가 기본 이니셜라이저를 제공하므로 빈 init()은 제거해도 됩니다.
- init() { - - } -Projects/Presentation/Splash/Project.swift (3)
5-5: 중복 import 제거ProjectTemplatePlugin가 중복으로 import되었습니다. 정리해주세요.
-import ProjectTemplatePlugin import ProjectTemplatePlugin
6-6: 불필요한 의존 import 정리DependencyPackagePlugin을 이 파일에서 사용하지 않으면 제거해 경고를 줄이세요.
8-18: 모듈 종류/Bundle ID 헬퍼 재검토makeAppModule 호출에 product: .staticFramework와 .appBundleID 조합이 헷갈립니다. 프레임워크라면 프레임워크용 Bundle ID 헬퍼(.frameworkBundleID 등) 또는 makeFrameworkModule 사용이 맞는지 확인 부탁드립니다. Tuist/플러그인 규약에 맞게 통일해 주세요.
Projects/Presentation/Splash/Sources/View/SplashView.swift (6)
69-75: logoScale도 명시적으로 애니메이션 처리현재 .animation의 value가 logoOpacity만 바라봅니다. logoScale 변경이 부드럽게 반영되도록 별도의 애니메이션을 추가하세요.
Image(asset: .splashLogo) .frame(width: 160, height: 160) .shadow(color: .black.opacity(0.35), radius: 8, x: 0, y: 6) .opacity(store.logoOpacity) .scaleEffect(store.logoScale) .animation( .easeInOut(duration: 1.2) .delay(0) .repeatCount(1, autoreverses: false), value: store.logoOpacity ) + .animation( + .easeInOut(duration: 1.2), + value: store.logoScale + )
79-87: 타이포그래피: 동적 글꼴과 현지화 고려고정 사이즈(48) 대신 Dynamic Type 대응(.minimumScaleFactor, .lineLimit 등)과 문자열 현지화를 권장합니다.
-Text("Bandscape") - .font(.pretendardFont(family: .bold, size: 48)) +Text(String(localized: "Bandscape")) + .font(.pretendardFont(family: .bold, size: 48)) + .lineLimit(1) + .minimumScaleFactor(0.8)
89-96: 부제도 Dynamic Type/현지화 적용작은 화면에서 가독성을 위해 스케일/줄바꿈과 현지화를 적용하세요.
-Text("The Soundscape of Every Season") +Text(String(localized: "The Soundscape of Every Season")) .font(.pretendardFont(family: .regular, size: 18)) + .lineLimit(2) + .minimumScaleFactor(0.9)
100-103: 저작권 연도 하드코딩 제거연도를 동적으로 계산해 매년 수정하지 않도록 하세요.
-Text("© 2025 Bandscape") +Text("© \(Calendar.current.component(.year, from: Date())) Bandscape")
110-114: 불필요한 투명 오버레이 제거opacity가 0인 Rectangle은 레이어만 늘립니다. 삭제하세요.
-Rectangle() - .fill(.black) - .opacity(0) - .ignoresSafeArea()
49-55: 큰 반경 Blur 다중 사용 — 퍼포먼스 주의저사양 기기(iOS 16)에서 초기 프레임 드랍 가능성이 있습니다. 필요 시 .drawingGroup(opaque:) 적용, blur 반경 축소, 또는 레이어 수를 줄이는 방안을 고려하세요.
Also applies to: 59-64
Projects/Presentation/Splash/Splash.xcodeproj/project.pbxproj (3)
525-528: 취약한 Header Search 경로Tuist의 .build 하위 상대 경로에 의존하고 있어 CI/개발 환경마다 깨질 수 있습니다. SPM가 제공하는 자동 헤더/모듈 경로를 사용하거나, $(BUILT_PRODUCTS_DIR)/… 등 표준 빌드 변수로 바꾸세요.
Also applies to: 591-595, 650-653, 712-715, 1020-1023, 1078-1081, 1141-1144
648-648: 서명 식별자 업데이트"iPhone Developer"는 구식입니다. "Apple Development"로 변경을 권장합니다(테스트 번들 포함).
-CODE_SIGN_IDENTITY = "iPhone Developer"; +CODE_SIGN_IDENTITY = "Apple Development";Also applies to: 1018-1018
418-424: 리소스 비어 있음 확인여러 타깃의 Resources 단계가 비어 있습니다. 의도라면 OK, 아니라면 에셋/Info.plist 포함 여부를 점검하세요.
Also applies to: 425-431, 442-448, 449-455
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
graph.pngis excluded by!**/*.png
📒 Files selected for processing (10)
Projects/App/Sources/Application/MusicBandscapeApp.swift(1 hunks)Projects/App/Sources/Reducer/AppReducer.swift(1 hunks)Projects/Presentation/Splash/Project.swift(1 hunks)Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift(1 hunks)Projects/Presentation/Splash/Sources/View/SplashView.swift(1 hunks)Projects/Presentation/Splash/Splash.xcodeproj/project.pbxproj(1 hunks)Projects/Shared/DesignSystem/Sources/Color/Colors.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Color/Extension+Color.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift(1 hunks)Projects/Shared/DesignSystem/Sources/Image/Extension+Image.swift(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift
- Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift
- Projects/Shared/DesignSystem/Sources/Color/Extension+Color.swift
🧰 Additional context used
🧬 Code graph analysis (1)
Projects/Presentation/Splash/Sources/View/SplashView.swift (1)
Projects/Shared/DesignSystem/Sources/Font/PretendardFont.swift (2)
body(22-24)pretendardFont(43-46)
🪛 SwiftLint (0.57.0)
Projects/Presentation/Splash/Project.swift
[Warning] 5-5: Imports should be unique
(duplicate_imports)
🔇 Additional comments (7)
Projects/Shared/DesignSystem/Sources/Image/Extension+Image.swift (1)
8-12: 이전 리뷰 피드백이 잘 반영되었습니다! 👍UIKit 조건부 임포트가 추가되어 이전에 지적된 컴파일 오류가 해결되었습니다.
Projects/App/Sources/Reducer/AppReducer.swift (3)
12-23: TCA 패턴을 올바르게 따르고 있습니다.State 구조와 초기화가 적절하며, 주석 처리된 mainTab은 향후 확장을 위한 명확한 방향을 제시합니다.
25-39: Action 구조가 TCA 권장사항을 잘 따릅니다.ViewAction 프로토콜 사용과 view/scope 분리는 명확한 책임 구분을 제공합니다.
42-61: Reducer 구성이 올바릅니다.의존성 선언과 body 구현이 TCA 패턴을 정확히 따르고 있으며, 이전 리뷰에서 언급된 가시성 문제(
public var body)도 해결되었습니다.Projects/App/Sources/Application/MusicBandscapeApp.swift (2)
13-13: AppDelegate 연동이 적절합니다.의존성 주입 부트스트랩을 위한 delegate adaptor 사용이 올바릅니다.
22-28: Store 초기화와 디버그 로깅이 올바르게 구현되었습니다.이전 리뷰에서 제기된 프로덕션 빌드 디버그 로깅 문제가
#if DEBUG조건부 컴파일로 해결되었습니다. Store 초기화 로직도 적절합니다.Projects/Shared/DesignSystem/Sources/Color/Colors.swift (1)
10-20: 이전 hex 형식 불일치 문제가 완전히 해결되었습니다.
Color.init(hex:)초기화 메서드가Extension+Color.swift파일에 올바르게 구현되어 있으며, 6자리 및 8자리 hex 문자열을 모두 지원합니다.Colors.swift의 모든 9개 색상은 일관되게 6자리 hex 형식을 사용하고 있으며,textSecondary도"7A7A7A"로 정상 처리되었습니다.코드가 표준 Swift Color 확장 패턴을 따르고 있으며, 모든 색상이 올바르게 구성되어 있습니다.
| @Test func <#test function name#>() async throws { | ||
| // Write your test here and use APIs like `#expect(...)` to check expected conditions. | ||
| } |
There was a problem hiding this comment.
플레이스홀더 구문을 제거하고 실제 테스트를 구현해야 합니다.
이 테스트 메서드에는 다음 문제가 있습니다:
<#test function name#>()플레이스홀더 구문은 유효한 Swift 코드가 아니며 컴파일 오류를 발생시킵니다.- 테스트 본문이 완전히 비어있어 SplashReducer에 대한 실제 테스트가 없습니다.
테스트를 구현하지 않을 경우 이 파일을 커밋하지 말고 제거하는 것을 권장합니다. 그렇지 않으면 실제 테스트 로직을 작성해야 합니다.
SplashReducer의 상태 전환, 액션 처리, 부수 효과 등을 테스트하는 실제 테스트 코드를 생성해드릴까요?
🤖 Prompt for AI Agents
In Projects/Presentation/Splash/SplashTests/Sources/SplashReducerTests.swift
around lines 12–14, remove the invalid placeholder signature `<#test function
name#>() async throws { ... }` and either delete the file if no tests are
intended, or replace it with a real test: give the function a valid XCTest name
(e.g., `testReducerHandlesAction_updatesState()`), keep the `async throws` if
needed, and implement assertions that exercise SplashReducer behavior (initial
state → dispatch action(s) → assert resulting state and any side effects using
XCTAssert/expect helpers and test store utilities). Ensure the test compiles,
uses real actions/state from SplashReducer, and covers the intended transitions
or effects.
There was a problem hiding this comment.
@Roy-wonji, 이해했습니다! 🙏
파일의 나머지 부분에 실제 테스트가 구현되어 있다는 점을 확인했습니다. AI 요약에서 animationSequence_runsInOrder와 animationSequence_cancelInFlight 같은 구체적인 테스트 케이스들이 있는 것을 볼 수 있네요.
diff에는 파일의 상단 일부만 표시되어서 플레이스홀더만 보였던 것 같습니다. 실제 테스트 구현이 있다면 문제없습니다! 😊
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (3)
Projects/Presentation/Splash/SplashTests/Sources/SplashReducerTests.swift (1)
25-33: 중복된 테스트 초기화 헬퍼로 정리TestClock/TestStore 초기화가 중복됩니다. 헬퍼로 추출해 중복을 줄이고 가독성을 높이세요. 예: makeStore()가 (store, clock)를 반환하도록 구성.
Also applies to: 69-76
Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift (2)
18-27: 바인딩 관련 보일러플레이트 제거 권장 (현재 미사용)State에 @BindableState가 없으므로 BindingReducer/BindableAction/case .binding은 불필요합니다. 제거해 단순화하세요. 추후 바인딩 필요 시 다시 추가하면 됩니다.
- public enum Action: ViewAction, BindableAction { - case binding(BindingAction<State>) + public enum Action: ViewAction { case view(View) case inner(InnerAction) case navigation(NavigationAction) } @@ - BindingReducer() Reduce { state, action in switch action { - case .binding(_): - return .noneAlso applies to: 30-36, 68-75
116-135: 매직 넘버 상수화로 테스트 안정성↑지연(300ms/200ms/300ms, 2s)과 애니메이션(1.2s)이 하드코딩돼 테스트와 강결합입니다. 내부 상수로 묶어 테스트에서도 동일 상수를 참조하면 드리프트를 방지할 수 있습니다.
private enum Anim { static let duration: TimeInterval = 1.2 static let logoToText = Duration.milliseconds(300) static let textToSubtitle = Duration.milliseconds(200) static let subtitleToFooter = Duration.milliseconds(300) static let toMain = Duration.seconds(2) }그리고 사용처를 Anim.*로 교체하세요.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift(1 hunks)Projects/Presentation/Splash/Splash.xcodeproj/project.pbxproj(1 hunks)Projects/Presentation/Splash/SplashTests/Sources/SplashReducerTests.swift(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-23T01:43:01.580Z
Learnt from: Roy-wonji
PR: SpartCodig-iOS/MusicBandscape#4
File: Projects/Presentation/Presentation/Presentation.xcodeproj/project.pbxproj:85-114
Timestamp: 2025-10-23T01:43:01.580Z
Learning: In Tuist-managed iOS projects (identified by Tuist/ directory, Project.swift manifest files, and Tuist references in build settings), the .xcodeproj/project.pbxproj files are auto-generated and should not be manually edited. Build phases including 'Dependencies' Copy Files phases are generated by Tuist based on the Project.swift manifests, and manual changes will be overwritten on the next `tuist generate` run. Do not flag or suggest manual modifications to pbxproj files in Tuist projects.
Applied to files:
Projects/Presentation/Splash/Splash.xcodeproj/project.pbxproj
🔇 Additional comments (2)
Projects/Presentation/Splash/Splash.xcodeproj/project.pbxproj (1)
1-1127: Tuist가 생성·관리하는 파일입니다 — 수동 수정 제안 건너뜁니다이 pbxproj는 Tuist가 재생성합니다. 수동 편집 제안은 다음 생성 시 덮어써집니다. 별도 이슈 없으면 리뷰 생략합니다.
Based on learningsProjects/Presentation/Splash/Sources/Reducer/SplashFeature.swift (1)
102-110: 네비게이션 처리 주체 확인 필요.presentMain이 .none을 반환합니다. 상위(App) 리듀서가 이 액션을 처리해 실제 전환을 수행하는지 확인 부탁드립니다. 현재 의도대로라면 OK입니다.
| private enum CancelID { case animation } | ||
|
|
There was a problem hiding this comment.
.cancellable 식별자 Hashable 누락 → 컴파일 실패
Effect.cancellable(id:)의 ID는 Hashable이어야 합니다. 아래처럼 Hashable을 추가하세요.
- private enum CancelID { case animation }
+ private enum CancelID: Hashable { case animation }🤖 Prompt for AI Agents
In Projects/Presentation/Splash/Sources/Reducer/SplashFeature.swift around lines
64 to 65, the CancelID enum used as the id for Effect.cancellable(id:) must
conform to Hashable; update the enum declaration to add Hashable conformance
(e.g., make CancelID conform to Hashable) so Effect.cancellable(id:) compiles.
There was a problem hiding this comment.
@Roy-wonji 수정 확인해주셔서 감사합니다! 👍
| @Test("애니메이션 시퀀스가 올바른 순서로 진행", ) | ||
| func animationSequence_runsInOrder() async throws { |
There was a problem hiding this comment.
컴파일러 오류: @test 속성 인자 뒤 불필요한 쉼표 제거 필요
현재 표기는 문법 오류입니다. 아래처럼 쉼표를 제거하세요.
- @Test("애니메이션 시퀀스가 올바른 순서로 진행", )
+ @Test("애니메이션 시퀀스가 올바른 순서로 진행")📝 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.
| @Test("애니메이션 시퀀스가 올바른 순서로 진행", ) | |
| func animationSequence_runsInOrder() async throws { | |
| @Test("애니메이션 시퀀스가 올바른 순서로 진행") | |
| func animationSequence_runsInOrder() async throws { |
🤖 Prompt for AI Agents
In Projects/Presentation/Splash/SplashTests/Sources/SplashReducerTests.swift
around lines 23 to 24, the @Test attribute contains an extraneous comma after
its argument which causes a compiler error; remove the trailing comma so the
attribute is written as @Test("애니메이션 시퀀스가 올바른 순서로 진행") and keep the test
function signature unchanged.
There was a problem hiding this comment.
Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!
🔗 관련 이슈
✨ 작업 내용
📸 Showcase
Summary by CodeRabbit
릴리스 노트
New Features
Improvements