반응형
LinkedIn 개발자로 성장하면서 남긴 발자취들을 확인하실 수 있습니다.
Github WWDC Student Challenge 및 Cherish, Tiramisul 등 개발한 앱들의 코드를 확인하실 수 있습니다.
개인 앱 : Cherish 내 마음을 들여다보는 시간, 체리시는 디자이너와 PM과 함께 진행 중인 1인 개발 프로젝트입니다.
10년 후, 20년 후 나는 어떤 스토리 텔러가 되어 있을지 궁금하다. 내가 만약에 아직 조금 더 탐구하고 싶은 게 있고, 궁금한 게 있다면, 그게 설사 지금 당장의 내 인생에 도움이 안 되는 것 같더라도 경험해보자. 그 경험들을 온전히 즐기며 내 것으로 만들고, 내 일에 녹여내고... 그러다보면 그 점들이 모여 나란 사람을 그려내는 선이 될 테니까.

Recent Posts
Recent Comments
Total
관리 메뉴

꿈꾸는리버리

SwiftUI : ExtractsubView 본문

오뚝이 개발자/SwiftUI

SwiftUI : ExtractsubView

rriver2 2022. 6. 1. 19:30
반응형

오늘은 body 안의 코드를 줄이는 방법에 대해 알아볼 거다 !

요즘 NC1 이후 코드 정리를 하는데에 아쉬움이 남았던 부분들을 공부하는 중인데 하나 둘 포스팅을 하려 한다 !

 

 

 이렇게 3개의 둥근 사각형 View가 있다. 

아래 코드를 보면 알겠지만, 안에 들어가는 값이 달라지며, 3번 반복이 된다.

struct ExtractSubView: View {
    
    var body: some View {
        ZStack{
            VStack{
                VStack{
                    Text("1")
                    Text("Apple")
                }
                .padding()
                .frame(width: 100)
                .background(Color.red)
                .cornerRadius(10)
                VStack{
                    Text("4")
                    Text("Peach")
                }
                .padding()
                .frame(width: 100)
                .background(Color.pink)
                .cornerRadius(10)
                VStack{
                    Text("2")
                    Text("Orange")
                }
                .padding()
                .frame(width: 100)
                .background(Color.orange)
                .cornerRadius(10)
            }
        }
    }
}

 

 이때 드는 의문,,, 이 코드를 줄일 수는 없을까 ? 

요로케 하면 된다 !

 

ExtractSubView struct 안에

이렇게 해당 내용을 작성하고 , 

var 변수명 : some View {
   // ~~ 내용
}

변수명을 body 안에서 호출하면 해당 View가 불러와진다.

struct ExtractSubView: View {
    
    var body: some View {
        ZStack{
            VStack{
            // body 내의 코드가 확 줄어들었음을 알 수 있다 !
                myItem
                myItem
                myItem
            }
        }
    }
    
    var myItem : some View{
        VStack{
            Text("1")
            Text("Apple")
        }
        .padding()
        .frame(width: 100)
        .background(Color.red)
        .cornerRadius(10)
    }
}

 

 근데 우리가 원하는 건 apple 3개가 아니잖아요 ??!!! 

그럼 우리는 뭘 하고 싶은 거지 ? 

 

 우리는 같은 형태의 View 에서 숫자, 과일 이름과 배경 색을 바꾸고 싶다...! 

처음에 우리가 swiftUI를 만들면 이런 코드가 뜨잖아유,,?

struct SwiftUIView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

 

1) 이 형태랑 똑같은 struc를 ExtractSubView struct 밖에  작성 ➿!

struct View이름: View {
    
    // 필요한 변수들 선언
    
    var body: some View {
        // ~~ 내용
    }
}

 

2) 우리는 과일 이름과, 과일 개수 변수, 그리고 배경 색이 필요하니까, 변수들을 struct 안에 선언해주고,

struct View이름: View {
    
    let title : String
    let count : Int
    let color : Color
    
    var body: some View {
        // ~~ 내용
    }
}

 

3) body안에 View에 보여질 요소들을 앞서 선언한 변수들과 함께 작성 ➿!

struct View이름: View {
    
    let title : String
    let count : Int
    let color : Color
    
    var body: some View {
        VStack{
            Text("\(count)")
            Text("\(title)")
        }
        .padding()
        .frame(width: 100)
        .background(color)
        .cornerRadius(10)
     }
}

 

4) 마지막으로 원래 struct(ExtractSubView)에 방금 생성한 View의 인스턴스를 만들어주면 됨!

View이름(title: "Apple", count: 1, color: Color.red)

struct ExtractSubView: View {
    
    var body: some View {
        ZStack{
            VStack{
                MyItemView(title: "Apple", count: 1, color: Color.red)
                MyItemView(title: "Peach", count: 4, color: Color.pink)
                MyItemView(title: "Orange", count: 2, color: Color.orange)
            }
        }
    }
}

struct MyItemView: View {
    
    let title : String
    let count : Int
    let color : Color
    
    var body: some View {
        VStack{
            Text("\(count)")
            Text("\(title)")
        }
        .padding()
        .frame(width: 100)
        .background(color)
        .cornerRadius(10)
    }
}

 

 

+ 마지막으로 한번 더 줄일 수 있다 !!

struct ExtractSubView: View {
    
    var body: some View {
        ZStack{
            fruits
        }
    }
    
    var fruits : some View{
        VStack{
            MyItemView(title: "Apple", count: 1, color: Color.red)
            MyItemView(title: "Peach", count: 4, color: Color.pink)
            MyItemView(title: "Orange", count: 2, color: Color.orange)
        }
    }
}

 

정리를 하면,

 변수가 없는 View는 struct 안에 이렇게 코드를 짜면 되고, 

var myItem : some View{
        VStack{
            Text("1")
            Text("Apple")
        }
        .padding()
        .frame(width: 100)
        .background(Color.red)
        .cornerRadius(10)
}

// 호출은
// myItem 이렇게 !

 

 변수가 있는 View는 struct 밖에 이렇게 코드를 짜면 된다 ! 

struct MyItemView: View {
    
    let title : String
    let count : Int
    let color : Color
    
    var body: some View {
        VStack{
            Text("\(count)")
            Text("\(title)")
        }
        .padding()
        .frame(width: 100)
        .background(color)
        .cornerRadius(10)
    }
}

// 호출은
// MyItemView(title : "Apple", count : 1, color : Color.red) 이렇게 !

 

 알면 좋은 것 ! 

변수가 있을 때 command + 클릭 -> Extract SubView 클릭 

 

 꼭 반복되는 요소만 코드를 묶어야 할까 ?  --> NOOOO!  

코드가 짱 길어지면, 작성자는 물론 코드를 읽는 사람도 해당 내용을 이해해하기 힘들다.

그래서 코드를 빼서 정리를 하는 것이 현재 함께 일하는 팀원에게, 그리고 미래의 나에게도... 좋은 일이다 !

반응형

'오뚝이 개발자 > SwiftUI' 카테고리의 다른 글

SwiftUI : StateObject 실험실  (2) 2022.06.02
SwiftUI : ViewModifier  (0) 2022.06.01
SwiftUI : HStack, VStack, ZStack  (0) 2022.05.31
SwiftUI : Frame  (0) 2022.05.24
SwiftUI : Custom Color  (0) 2022.05.24
Comments