(※ 실제 코드 유출 방지를 위해 약간의 코드 변형을 하였습니다.)
struct FirstButtonView: View {
let focused: Bool
let action: () -> Void
var body: some View {
Button {
action()
} label: {
Text("시작하기")
.foregroundColor(focused ? Color.white : Color.lightGreen)
.padding(.vertical, 14)
}
.frame(height: 50)
.background(focused ? Color.green : Color.white)
.cornerRadius(8)
.overlay(
Group {
if !focused { RoundedRectangle(cornerRadius: 8).stroke(Color.green) }
}
)
}
}
struct SecondButtonView: View {
let focused: Bool
let action: () -> Void
var body: some View {
Button {
action()
} label: {
Text("둘러보기")
.foregroundColor(focused ? Color.white : Color.lightGreen)
.padding(.vertical, 14)
}
.frame(height: 50)
.background(focused ? Color.green : Color.white)
.cornerRadius(8)
.overlay(
Group {
if !focused { RoundedRectangle(cornerRadius: 8).stroke(Color.green) }
}
)
}
}
...
VStack(spacing: 10) {
FirstButtonView(focused: false, action: { ... })
SecondButtonView(focused: true, action: { .... })
}
...
enum IntroButtonType: Codable {
case start
case lookaround
func getTitle() -> String {
switch self {
case .start:
return "시작하기"
case .lookaround:
return "둘러보기"
}
}
}
struct IntroButton: Hashable, Codable {
let type: IntroButtonType
let focused: Bool
}
struct IntroButtonView: View {
let button: IntroButton
let IntroButtonAction: (IntroButtonType) -> Void
var body: some View {
Button {
IntroButtonAction(button.type)
} label: {
Text(button.type.getTitle())
.foregroundColor(button.focused ? Color.white : Color.lightGreen)
.padding(.vertical, 14)
}
.frame(height: 50)
.background(button.focused ? Color.green : Color.white)
.cornerRadius(8)
.overlay(
Group {
if !button.focused { RoundedRectangle(cornerRadius: 8).stroke(Color.green) }
}
)
}
}
...
VStack(spacing: 10) {
ForEach(viewModel.buttonList, id: \.self) { button in
IntroButtonView(button: button, IntroButtonAction: viewModel.introButtonAction(_:))
}
}
...
막 현업에서 일하기 시작했을 때, 코드 복사/붙여넣기를 많이 했었고 습관을 고치는 데에 시간이 꽤나 들었다.
공용화할 수 있는 View를 최대한 사용하여 동일한 구조의 View 코드 반복을 줄이거나 상속 받아 코드 중복을 줄이기 위해 노력을 했다.
View와 ViewModel이 각자의 역할에 충실한 MVVM이 되도록 항상 신경써야 한다.