해결된 질문
20.12.11 23:45 작성
·
165
답변 2
1
2020. 12. 12. 00:56
안녕하세요
질문을 나눠서 답변 드리면
우선
didSet은 값이 바뀌고 난 후고
값이 바뀌기 직전은 willSet입니다.
프로퍼티 옵저버는 그 프로퍼티 자체가 바뀌었을 때 호출되는데
class같은 레퍼런스 타입과 struct같은 밸류타입일 경우에 didSet이 호출되는 상황이 달라집니다.
UITableView는 class인 레퍼런스 타입입니다.
이때 class가 가진 속성을 바꾼다고 해서 그 자체(class)는 바뀌지 않습니다.
예를들어
tableView.BackgroundColor = .red
이렇게 한다고 해서 tableView자체가 변경되지 않습니다.
단지 안에 배경색 속성이 달라졌을 뿐이죠.
그러니 didSet은 tableView가 가진 속성을 바꾼다고 해서 호출되는일은 없습니다.
질문하신 내용에서 프로퍼티가 IBOutlet으로 연결해놓으면
nil값으로 tableView가 생성되고 -> 스토리보드 등에서 만들어진 tableView객체가 연결됩니다.
이때 nil -> 생성된 tableView로 그 프로퍼티 자체가 바뀌게 됩니다.
그래서 오직 생성된 객체로 자기자신이 바뀌는 그 시점에 didSet이 단 한번 호출됩니다.
이런 특성을 이용해서 단 한번 설정하고 안 하는 코드를 보통 viewDidLoad에서 하는 경우가 일반적이지만
그렇게 하다가 viewDidLoad가 너무 커지면 어떤코드에 대한 부분인지 한눈에 잘 안들어 오는 경우가 많습니다.
그래서 프로퍼티가 class타입일 경우 didSet이 딱 한번 호출될 것이라고 충분히 예상할 수 있다면 viewDidLoad와 비슷한 성격으로 쓸 수 있기 때문에 질문하신 스타일의 코드를 흔하게 사용하게 됩니다.
그리고 Struct같은 value타입일 경우에는 안에 속성이 바뀌는것이 그 객체 자체가 바뀌는 것을 의미합니다.
예를들어
struct SomeStruct {
var color = UIColor.red
}
var someStruct = SomeStruct()
이런 struct가 있을 때 색상을 바꿀때마다 이 프로퍼티 자체가 변경된 프로퍼티가 됩니다.
따라서 매번 속성값을 변경할때마다 그 자체가 변경되니 didSet은 그때마다 호출되게 됩니다.
이럴때 딱 한번 설정하고 싶은 코드가 있을 때 didSet에 넣어놓으면 변경될 때마다 호출되니 문제가 생기겠죠
그 차이점을 이해하고 사용하시면 프로퍼티 옵저버를 어떻게 쓰면 좋은지 감이 잡히실 겁니다.
0
2020. 12. 15. 10:21
와..이해가 너무 쏙쏙 갔습니다.
항상 iOS Developer 선생님 강의 잘보고 정말 많이 배웠습니다.
오토레이아웃편으로 레이아웃 그리는법 실력도 많이 쌓았습니다.
얼마전에 스유 편도 구매해서 열심히 배우고있습니다.
항상 좋은 강의 많이 올려주셔서 감사합니다. ㅠㅠ