인프런 커뮤니티 질문&답변

제승욱님의 프로필 이미지

작성한 질문수

Part2: 초중급 iOS 인스타그램 클론(SwiftUI, MVVM, Firebase, 2024)

65. 검색결과 클릭해서 프로필뷰로 이동 구현

init 함수가 없는 구조체에 인자가 들어갈 수 있는 이유가 궁금합니다.

해결된 질문

24.06.13 18:33 작성

·

111

1

"ProfileView(viewModel: ProfileViewModel(user: user))"

ProfileView에는 init함수가 존재하지 않지만

viewModel을 인자로 받아서 생성자를 호출할 수 있는 이유가 무엇인지 궁금합니다.

viewModel에 @state를 사용했기 때문일까요?

"구조체에 @state변수가 있다면 해당 구조체를 새로 만들 때 인자로 부여할 수 있다."

이렇게 이해하면 될까요??

@state에 대해 설명부탁드립니다

 

답변 1

0

애구마(agmma)님의 프로필 이미지
애구마(agmma)
지식공유자

2024. 06. 13. 22:08

제승욱님 안녕하세요!

  1. 뷰에 인자를 넣어주는것은 @State와는 상관이 없습니다.

아래 코드처럼 하위뷰의 @State가 없고 프로퍼티(전달받을인자)만 선언되도 ChildView(전달받을인자:) 이런식으로 인자를 전달해줄 수 있습니다.

import SwiftUI

struct ContentView: View {
    var body: some View {
        ChildView(전달받을인자: "이 문자열을 전달")
    }
}

struct ChildView: View {
    var 전달받을인자: String
    
    var body: some View {
        Text("\(전달받을인자)")
    }
}

 

  1. struct에서 init은 생략될 수 있습니다.
    init이 없어도 인자를 전달할 수 있는 이유는 structs는 기본 init을 자동으로 제공해줍니다.

따라서 아래 init을 명시해주는 코드와 1번에서 제공하는 코드는 같은 코드입니다.

struct ContentView: View {
    var body: some View {
        ChildView(전달받을인자: "이 문자열을 전달")
    }
}

struct ChildView: View {
    var 전달받을인자: String
    init(전달받을인자: String) {
        self.전달받을인자 = 전달받을인자
    }
    
    var body: some View {
        Text("\(전달받을인자)")
    }
}


3. @State의 역할

@State를 붙여주는 이유는 @State를 붙인 변수가 "수정될 수 있고", "수정된 사항"이 뷰에 자동으로 반영되기 때문입니다.

예를들어 아래처럼 버튼을 추가해서 string을 변경하는 코드는 에러를 내뱉습니다

struct ContentView: View {
    var body: some View {
        ChildView(전달받을인자: "이 문자열을 전달")
    }
}

struct ChildView: View {
    var 전달받을인자: String
    init(전달받을인자: String) {
        self.전달받을인자 = 전달받을인자
    }
    
    var body: some View {
        Text("\(전달받을인자)")
        Button {
            전달받을인자 += "1"
        } label: {
            Text("Button")
        }

    }
}

왜냐하면 struct의 내부에 있는 "전달받을인자" 프로퍼티는 뷰에서 수정이 될 수 없기 때문입니다.

그런데 이부분을 아래처럼 @State를 붙여준다면 에러는 사라지고 버튼을 클릭해서 변경된 변수내용이 뷰에 자동으로 반영됩니다.

 

struct ContentView: View {
    var body: some View {
        ChildView(전달받을인자: "이 문자열을 전달")
    }
}

struct ChildView: View {
    @State var 전달받을인자: String
    init(전달받을인자: String) {
        self.전달받을인자 = 전달받을인자
    }
    
    var body: some View {
        Text("\(전달받을인자)")
        Button {
            전달받을인자 += "1"
        } label: {
            Text("Button")
        }

    }
}


최종결과

image

 

 

또 궁금하신 사항있으면 질문 주세요~

 

그리고 지난번에 제가 메일로 기프티콘 보내드렸었는데요.

사용이 안된거 같은데 한번 확인해보실래요?

즐거운 저녁 되세요~ :D

제승욱님의 프로필 이미지
제승욱
질문자

2024. 06. 15. 04:02

이유는 모르겠지만 선물 등록이 안되더라고요 ㅎㅎ... 마음만으로도 충분합니다 애구마님 감사합니다.

친절한 답변 감사합니다!

애구마(agmma)님의 프로필 이미지
애구마(agmma)
지식공유자

2024. 06. 16. 12:14

흑 감사합니다!!

유익한 수강되시길 바랄게요!