해결된 질문
작성
·
141
답변 1
0
제승욱님 안녕하세요!
뷰에 인자를 넣어주는것은 @State와는 상관이 없습니다.
아래 코드처럼 하위뷰의 @State가 없고 프로퍼티(전달받을인자)만 선언되도 ChildView(전달받을인자:) 이런식으로 인자를 전달해줄 수 있습니다.
import SwiftUI
struct ContentView: View {
var body: some View {
ChildView(전달받을인자: "이 문자열을 전달")
}
}
struct ChildView: View {
var 전달받을인자: String
var body: some View {
Text("\(전달받을인자)")
}
}
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")
}
}
}
최종결과
또 궁금하신 사항있으면 질문 주세요~
그리고 지난번에 제가 메일로 기프티콘 보내드렸었는데요.
사용이 안된거 같은데 한번 확인해보실래요?
즐거운 저녁 되세요~ :D
이유는 모르겠지만 선물 등록이 안되더라고요 ㅎㅎ... 마음만으로도 충분합니다 애구마님 감사합니다.
친절한 답변 감사합니다!