inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

216

제승욱

작성한 질문수 3

1

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

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

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

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

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

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

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

 

ios firebase swiftui mvvm

답변 1

0

밤낮 코딩

제승욱님 안녕하세요!

  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

1

제승욱

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

친절한 답변 감사합니다!

1

밤낮 코딩

흑 감사합니다!!

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

 

searchable이 화면 하단에 위치해요

0

60

2

warning 하나가 있는 것 같습니다. 해결방법좀 알려주세요

0

79

2

설계 관련하여 참고할 문서나 예제 공유가 가능할까요?

1

71

2

Thread number가 다 1로 나옵니다

1

69

2

'loadAllPosts' 를 매번 사용해야 하나요?

1

69

2

75강 실시간으로 팔로우수 안늘어나는 이유?

1

135

3

예전코드도 배워야 할까요?

1

137

1

ProfileView에서 toolbar이용시 문제점 발생, 로직이 이해가 되지 않습니다.

0

161

1

62강 Follow, Unfollow기능구현에서,,

0

107

2

애구마선생님, 다음 프로젝트 강의는 언제 올려주세요???

0

108

2

51강 10:22에서 이미지 여러장이 나오지 않아요;;

0

108

2

52강 post데이터가 불러와지지 않아요,,,

0

135

2

ViewModel과 Model 구분 (30강)

1

133

2

바인딩하는 이유

1

94

2

75강 까지 마무리후 소스 오류 사항 문의

0

109

1

SwiftUI main actor 관한 경고 계속 뜹니다.

1

245

2

45강의 에서 Kingfisher 사용후 발생하는 swift6 이슈

1

152

2

19강에서 Encoder()를 사용할 수 없습니다.

1

135

2

40. 강에서 정상작동 안합니다.

0

168

3

프로필 수정 후 변경된 내용을 피드에 바로 반영되도록 하고 싶습니다.

1

134

2

15강에서 발생한 문제에 대해서 질문이 있습니다!

1

301

3

13강 코드 작성 후 피드의 유저 데이터가 보이지 않는 문제

1

217

3

혹시 다음 강의 대략 언제쯤 완료되시는지 알 수 있을까요??

1

166

2

섹션7 뷰 리팩토링 질문있습니다.

0

106

2