서브스크립트에서 setter구현을 강제하는 이유 ⭐️⭐️
<aside>
💡 서브스크립트에서 구조체와 같은 값타입(밸류타입)을 getter로만 구현해서 리턴하게 되면 (여기서는 Member가 구조체, 값타입으로 구현) 해당 타입이 변할 수 없는 immutable value로 (쉽게 말하면 상수 let)으로 적용이 되게 됩니다.
**즉, Member를 읽기(get)만 가능하게 구현하면, 리턴된 Member인스턴스 자체가 읽기만 가능한(let) 값으로 적용되게 된다는 뜻**입니다. (읽기만 가능하게 구현했으니, 리턴하는 값도 읽기만 가능하게 적용시킬꺼야.. 이런 의미)
다른 말로 하자면.. 아래처럼 Member구조체가 아무리 내부 저장 속성(변수) 등이 var로 변할 수 있게 구현이 되어 있다고 하더라도
```swift
struct Member {
//...
lazy var memberImage: UIImage? = {
//...
}()
let memberId: Int
var name: String?
var age: Int?
var phone: String?
var address: String?
}
서브스크립트 getter를 통해, 즉 읽을 수만 있는 값으로 구현을 해놓았으니…
struct Member {
//...
lazy var memberImage: UIImage? = { // var가 아닌 let화 불가능⭐️⭐️⭐️
//...
}()
let memberId: Int
let name: String? // var가 아닌 let화 되어버림 ⭐️
let age: Int? // var가 아닌 let화 되어버림 ⭐️
let phone: String? // var가 아닌 let화 되어버림 ⭐️
let address: String? // var가 아닌 let화 되어버림 ⭐️
}
이런 식으로 코드가 적용된다는 것입니다.
그런데 여기서의 문제는 memberImage속성의 경우, lazy에 계산 속성으로 계산 했기 때문에 아예 let적용이 불가능하다는 것입니다. 따라서, let적용이 불가능한 속성이 있고, 이것을 스위프트에서 인지하고 있기 때문에 var밖에 적용 할 수 밖에 없기 때문에 setter까지 구현하도록 강제하고 있는 것입니다.
</aside>