안녕하세요!
공부하다가 팁이라기도 정말 아주 많이 민망한데,
혹시라도 저처럼 미처 생각지 못하셨던 분이 있으시다면 도움이 되시라고 정리해 봅니다.
혹시 아래처럼 TableView나 하위 뷰를 이렇게 초기화하셨던 분이라면 한 번쯤 보셔도 좋을 거 같습니다.
// TableView의 Cell을 초기화 하는 상황
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "subCell", for: indexPath) as! subCell
cell.textA.text = dataSource[indexPath.row].textA
cell.textB.text = dataSource[indexPath.row].textB
cell.textC.text = dataSource[indexPath.row].textC
return cell
}
// 상위 뷰에서 하위 뷰를 초기화 하는 상황
let subView: CustomSubview = {
let view = CustomSubView()
view.textA.text = "textA"
view.textB.text = "textB"
view.textC.text = "textC"
return view
}()
이제 제목처럼 상위 뷰에서 함수로 Cell을 초기화하면 이런 모습입니다.
// setConfig() 함수로 TableView의 Cell을 초기화 하는 상황
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "subCell", for: indexPath) as! subCell
cell.setConfig(textA: dataSource[indexPath.row].textA,textB: dataSource[indexPath.row].textB,textC: dataSource[indexPath.row].textC)
return cell
}
// setConfig() 함수로 상위 뷰에서 하위 뷰를 초기화 하는 상황
let subView: CustomSubview {
let view = CustomSubView()
view.setConfig(textA: "textA", textB: "textB", textC: "textC")
return view
}
이렇게 적용하려면 Cell이나 하위 뷰에서 setConfig() 함수를 다음처럼 정의해야겠죠?
// Cell에서 정의하는 초기화 함수
func setConfig(textA: String, textB: String, textC: String) {
self.textA.text = textA
self.textB.text = textB
self.textC.text = textC
}
// 하위 뷰에서 정의하는 초기화 함수
func setConfig(textA: String, textB: String, textC: String) {
self.textA.text = textA
self.textB.text = textB
self.textC.text = textC
}
이렇게 외부에서 함수로 초기화하면 장점이 몇 가지 있습니다.
1. 변수의 접근 제어를 private으로 설정 가능하다.
- 기존처럼 직접 접근해서 초기화 값을 넣으면 private 접근 제어자를 사용할 수 없었습니다.
- 외부에서 함부로 변수에 직접 접근할 수 없게 하여 은닉화의 장점을 챙길 수 있습니다.
2. 초기화 값을 입력하지 않는 실수가 줄어든다.
- 초기화 함수에서 파라미터로 들어갈 값들이 정해져 있으니 초기화해야 하는 값들을 입력하지 않는 실수를 줄일 수 있습니다.
- 또 꼭 초기화가 필요하지 않은 값들은 옵셔널을 활용하거나 기본값을 넣으면 될 것 같습니다.
3. 상위 뷰의 코드가 간결해진다.
- 몇 줄이라도 상위 뷰의 코드가 간결해질 수 있습니다.
- 크게 체감은 안되더라도 MVC 패턴처럼 뷰컨트롤러를 최대한 가볍게 하는 게 좋은 패턴이라면 은근 효과가 있겠죠!