인프런 커뮤니티 질문&답변

습득자님의 프로필 이미지

작성한 질문수

iOS12 앱 개발 퍼펙트 가이드

Q_Struct_VS_Class

질문드립니다.

해결된 질문

20.12.11 23:45 작성

·

165

0

안녕하세요. 

테이블뷰 델리게이트 설정하실 때

@IBoutlet tableView {

didSet {

tableView.delegate = self

tableView.dataSource = self

}

이런식으로 델리게이트 설정을 옵저버 프로퍼티에 해주셨는데요, 

프로퍼티 감시자 didSet은 값이 변경되기 직전에 사용되는걸로 알고있는데

테이블뷰에서 해당하는 값은 무엇인가요?

또한 이미지뷰에 didSet을 이용한다면

이미지뷰에서는 어떠한게 값의 변경으로 이용되는건지 궁금합니다!

답변 2

1

iOS Developer - 이정님의 프로필 이미지
iOS Developer - 이정
지식공유자

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 선생님 강의 잘보고 정말 많이 배웠습니다.

오토레이아웃편으로 레이아웃 그리는법 실력도 많이 쌓았습니다.

얼마전에 스유 편도 구매해서 열심히 배우고있습니다.

항상 좋은 강의 많이 올려주셔서 감사합니다. ㅠㅠ