-
Computed Property + Access ControlSwift 2021. 9. 30. 14:22
이전에 DTO, VO 관련 글을 작성하면서, Property 개념과 비슷한 부분이잖아? 했던 Property에 대해서 조금 더 자세히 적어보고자 한다. (https://kkimin.tistory.com/16)
연산 프로퍼티? 무슨말일까요
아주 쉽게 아래의 코드를 말합니다.
import Foundation class Test { private var temp: Int = 0 var result: Int { get { return temp } set { temp = newValue + 100 } } } var a = Test() a.result = 12
자 우선, 왜 저렇게 접근할까요? 정답1 : 정말 연산이 필요할때 / 정답2 : 연산 없이 value를 직접 꺼내지 않고 간접적으로 접근하는 측면을 위해 ( 그 이유는 차근차근 아래 더 설명됩니다.)
여기서 좀 더 나아가면, get set 둘다 가지고 있을 필요가 없습니당...!! get만 가질 수도 있지요! (읽기전용 Read-Only)
참고로 set만은 불가능합니다. set이 get보다 높은 접근 수준을 가졌기 때문이죠.
import Foundation struct Test { private let number = 1 var result: Int { return number + number // result (자기자신)은 오류! } } Test().result = 2 // 오류
여기서 Value를 간접적으로 접근하고 있다는것을 알게됩니다. 연산 프로퍼티에서 result 를 return result 할 수 없게 되면서 간접적으로 접근하게 되는 셈인것이죠.
여기서 접근 제어자 관련해서 연결을 해보고자 합니다. 정답2! - 연산이 따로 필요 없을때!
Test 와 Test2는 동일하다 (getter는 internal 이 되고, setter는 private 이다) Test2처럼 작성하게 되면 더 간결하고 명확하게 정의할 수 있다.
import Foundation struct Test { fileprivate var temp: Int = 0 var result: Int { get { return temp } set { temp = newValue } } } public struct Test2 { fileprivate(set) var result: Int = 0 } var a = Test2() a.result = 12
그렇다면 fileprivate이 아닌 경우는 어떨까? 아래와 같은 예제도 있을 수 있다.
class Test { private var temp: Int = 0 var result: Int { get { return temp } set { temp = newValue } } } public class Test2 { public private(set) var result: Int = 0 func setResultData(data: Int) { self.result = data } } var a = Test2() a.setResultData(data: 12) print(a.result)
위도 역시 Test와 Test2가 같습니다. 간접적으로 value를 set 하는 방법을 통하면 위처럼 작성할 수도 있습니다.
사실 Access Control이나 Property가 훨씬 방대한 내용을 가지고 있어. 참고가 될만한 내용 (내가 두고두고 보기 위해) 아래 적어둔다.
728x90'Swift' 카테고리의 다른 글
Swift Moya 설치 및 내용, RxMoya (0) 2021.10.13 자꾸 까먹는 Swift Array 안전하게 배열 조회 하는법 (0) 2021.09.30 Builder - dynamicMemberLookup (+ KeyPath) (0) 2021.09.30 dynamicMemberLookup (+ KeyPath) (0) 2021.09.23 ios 웹뷰와 통신 (Native <-> JavaScript 통신) (0) 2021.07.21