이와 위의 접근레벨과 섞으면 내부에선 읽고 쓰고, 외부에서는 읽기만 가능한게 만들 수 있다.
단순히 둘이 섞어보자면 아래와같게 하여 값을 보호할 수 있다.
public class AccessLevels {
private var realValue: String = ""
public var value: String {
get {
return realValue
}
}
func function() {
realValue = "real value"
}
}
let test: AccessLevels = .init()
print(test.value) // "\n"
test.function()
print(test.value) // real value
콘솔 출력값은 주석처리한 부분이다
다른 언어에서 get, set 함수를 따로 만들어 사용하는것과 유사하다
실제로 사용하는 변수는 realValue이고 외부에서 해당 값을 보기위해 realValue를 접근하려고하면 오류가 나고
이를 보기위해서는 value를 봐야한다.
사실 이를 더 간편히 만들 수 있는게 있는데 이게바로 이글의 주제인 private(set) 이다.
public class PrivateSet {
private(set) var value: String = ""
func function() {
value = "real value"
}
}
let test: PrivateSet = .init()
print(test.value) // "\n"
test.function()
print(test.value) // "real value"
PrivateSet 클래스는 위의 AccessLevels 클래스와 동일한 기능을 하는 클래스이다
get을 지정해주는 변수와 실제 값을 담아두는 변수가 private(set) 으로 value 하나로 통일되었다.