iOS/Swift

View에서 parameter를 선언할때 var, let 선택 기준

태애니 2025. 4. 13. 21:50
728x90

 

var, let 은 Swift 든 어떤 프로그래밍 언어에서든 제일 처음 배우게 된다.

변수, 상수

 

let은 값이 절대 바뀌지 않고

var은 값이 바뀔 수 있다.

 

View 에서 다른 View 로 전달을 받을 때, 어떤 View에서는 let으로 받고, 또 어떤 View에서는 var 로 받는다.

 

어떤 기준으로 선택해야할까?

 

 

일단 구체적으로

 

해당 받은 화면에서 값이 바뀌지 않을 경우에는 let을 1순위로 선택해야한다.

 

struct MySampleView: View {
    let title: String
    
    var body: some View {
        Text(title)
    }
}

 

View는 struct이기 때문에, 변경이 일어나면 새로 그리는 방식이므로 값이 내부에서 바뀔 경우에는 var를 선언해야한다.

struct MySampleView: View {
    var count: Int
    
    var body: some View {
        Text("Count: \(count)")
    }
}

 

 

또한 @State, @Binding, @ObservedObject, @EnvironmentObject 등의 속성은 값이 바뀌면서 뷰를 다시 그리겠다는 속성이기 때문에 반드시! var로 선언해야한다.

struct MySampleView: View {
    @State private var count = 0
    
    var body: some View {
        Button("Increase: \(count)") {
            count += 1
        }
    }
}

 

 

나는 이 질문을 받았을 때 머리에 있는 것들을 말로 설명하지를 못했다.🥲

 

여기서 private let, private var, public let, public var 대해 말을 하려니 말문이 막혔다.

 

 

private let 

뷰 내부에서만 사용하는 읽기 전용 상수라는 의미이다.

외부에서는 보거나 접근할 수 없고, 내부에서 계산용이나 상수로 쓸 때 사용한다.

struct MathView: View {
    private let multiplier = 5
    
    var body: some View {
        Text("Result: \(multiplier * 10)")
    }
}

 

 

private var

뷰 내부에서만 사용하는 읽고 쓸 수 있는 변수이다.

뷰 내부 상태를 추적하거나 조작할 때 사용하며, SwiftUI에서는 @State와 자주 같이 사용된다.

 

struct ToggleView: View {
    @State private var isOn = false
    
    var body: some View {
        Toggle("Switch", isOn: $isOn)
    }
}

 

 

public let

다른 모듈이나 파일에서 읽기만 가능하겠다는 의미이다.

외부에 값을 노출하되, 변경은 못 하게 하고 싶을 때 사용하면 된다.

public struct Book {
    public let title: String
    //외부에서 book.title을 읽을 수는 있지만, 바꿀 수는 없다
}

 

 

public var

외부에서 읽기와 쓰기 모두 가능하다.

기능적으로 꼭 필요한 경우가 아니면 신중하게 사용해야 하는 속성이다.

예기치 않은 외부 변경을 방지하기 위해 지양되는 경우가 많다.

public struct Counter {
    public var count: Int
    // 외부에서 Counter.count 값을 변경시켜버릴 수 있다. 주의해야함.
}

 

 

 

원하는 접근 범위(외부에 공개 여부)와 값의 변경 가능성(읽기/수정 여부)을 조합해서 결정하면 된다.

 

 

이게 뭐라고 설명을 못했을까...?😞

728x90