Equatable 뷰와 @State 범위
상태의 범위를 좁혀 무효화를 제한합니다.
Equatable 뷰와 @State 범위은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
같으면 작업을 건너뛸 수 있습니다
SwiftUI가 뷰의 입력값이 변경되지 않았음을 증명할 수 있다면 해당 뷰를 다시 그리는 작업을 건너뛸 수 있습니다. 뷰를 Equatable로 만들면 SwiftUI가 이를 정확하게 판단할 수 있습니다.
Equatable 따르기
뷰가 Equatable을 따르도록 선언하면 SwiftUI가 이전 값과 새 값을 비교합니다. 두 값이 같으면 body 계산을 건너뜁니다.
struct Badge: View, Equatable {
let count: Int
var body: some View { Text("\(count)") }
static func == (a: Badge, b: Badge) -> Bool {
a.count == b.count
}
}EquatableView
어떤 Equatable 뷰든 .equatable()로 감싸면 모든 호출 지점에서 타입을 변경하지 않고도 비교를 기준으로 건너뛰도록 요청할 수 있습니다.
Badge(count: total)
.equatable()Equatable이 유용한 경우
Equatable은 입력값은 비교하기 쉽지만 body 계산은 비싼 뷰에서 특히 효과적입니다. 효과를 보려면 비교 비용이 그리기 비용보다 훨씬 낮아야 합니다.
비교 비용의 함정
== 자체가 비싸다면(큰 배열을 깊이 비교하는 경우처럼) 건너뛰려는 그리기 작업보다 더 많은 비용이 들 수 있습니다. 비용이 낮고 결과를 결정하는 필드만 비교하십시오.
static func == (a: Self, b: Self) -> Bool {
a.id == b.id && a.version == b.version // cheap fields
}기본으로 합성되는 Equatable
저장된 속성이 모두 Equatable이면 Swift가 ==을 자동으로 합성할 수 있습니다. 하지만 클로저와 일부 유형은 Equatable이 아니므로 이를 무시하는 사용자 정의 구현이 필요할 수 있습니다.
struct Card: View, Equatable {
let title: String
let onTap: () -> Void // not Equatable
static func == (a: Card, b: Card) -> Bool { a.title == b.title }
var body: some View { Text(title) }
}@State 범위 좁히기
상태를 너무 높은 위치에 두면 그 아래의 모든 항목이 다시 그려집니다. @State를 이를 소유하는 가장 작은 뷰로 내리면 변경 사항이 영향을 주는 UI를 최소화할 수 있습니다.
// Move toggle state into the row that uses it
struct Row: View {
@State private var expanded = false
var body: some View { /* only this row re-renders */ Text("Row") }
}공유할 때만 상태 끌어올리기
여러 뷰가 실제로 상태를 필요로 할 때만 상태를 상위로 끌어올리십시오. 그렇지 않으면 로컬 상태를 사용해 다시 그려지는 범위를 작게 유지할 수 있습니다.
하위 뷰로 분리해 업데이트 범위 좁히기
자주 변경되는 부분을 자체 뷰로 분리하면 재평가가 해당 뷰에 국한되어 형제 뷰는 영향을 받지 않습니다.
struct LiveClock: View {
@State private var now = Date()
var body: some View { Text(now, style: .time) }
}바인딩과 범위
@Binding은 자식 뷰를 부모 뷰의 상태에 연결합니다. 전체 객체 대신 범위가 좁은 바인딩(한 항목)을 전달하면 어떤 변경 사항이 전파되는지 제한할 수 있습니다.
struct NameField: View {
@Binding var name: String // narrow binding
var body: some View { TextField("Name", text: $name) }
}Equatable과 범위 결합하기
가장 큰 효과는 여러 기법을 결합할 때 얻을 수 있습니다. 상태를 좁은 범위에 배치해 변경을 일으키는 요인을 줄이고, Equatable을 사용해 그래도 발생하는 다시 그리기를 건너뜁니다.
빠른 확인: Equatable 뷰
Equatable 뷰와 상태 범위에 대한 이해도를 확인해 보십시오.
복습: Equatable 뷰와 상태 범위
뷰를 Equatable로 만들거나 .equatable()을 사용하면 변경되지 않은 다시 그리기를 SwiftUI가 건너뛸 수 있습니다. 비교 비용이 그리기 비용보다 훨씬 낮고, 결과를 결정하는 필드만 사용할 때 효과적입니다.
@State를 이를 소유하는 가장 작은 뷰로 좁히고, 범위가 좁은 바인딩을 전달하며, 자주 변하는 부분을 자체 뷰로 분리하십시오. 촘촘한 상태 범위와 Equatable을 결합하면 다시 그리는 횟수와 각 작업의 비용을 최소화할 수 있습니다.
자주 묻는 질문
“Equatable 뷰와 @State 범위” 강의는 무료인가요?
네 — “Equatable 뷰와 @State 범위” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Equatable 뷰와 @State 범위”에서 뭘 배우나요?
상태의 범위를 좁혀 무효화를 제한합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“Equatable 뷰와 @State 범위” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 뷰 동일성 이해하기
- 본문 재평가 최소화
- Equatable 뷰와 @State 범위
- SwiftUI Instrument로 프로파일링하기