티스토리 뷰

수요일에 받은 코드 리뷰를 통해 좋은 말씀들을 많이 해주셔서 하나씩 학습해 정리해보려 합니다.

그중에서도 제네릭과 프로토콜을 활용해 dequeueReusableCell을 어떻게 처리하는지 알아보았습니다.

 

먼저

 

테이블 뷰에 테이블 뷰 셀을 나타내게 하려면 어떻게 하시나요.

테이블 뷰는 데이터 자체를 관리하지는 않고, 표현되는 데이터만 관리합니다. 

 

그래서 우리는 UITableViewDataSource를 채택해 필수 메소드를 적어줍니다.

이 친구들이 관리를 합니다.

 

아래는 UITableViewDataSource에 필수 메소드를 작성한 코드입니다.

// Return the number of rows for the table.     
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return 0
}

// Provide a cell object for each row.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   // Fetch a cell of the appropriate type.
   let cell = tableView.dequeueReusableCell(withIdentifier: "cellTypeIdentifier", for: indexPath)
   
   // Configure the cell’s contents.
   cell.textLabel!.text = "Cell text"
       
   return cell
}

여기서  numberOfRowsInSection에서는 몇 개의 row를 보여줄지 리턴해주고,

cellForRowAt에서는 각 row에 맞는 cell을 제공해줍니다.

 

cellForRowAt을 보면 dequeueReusableCell(withIdentifier: for:) 메소드가 있습니다.

dequeueReusableCell(withIdentifier: for)메소드는 어떤 역할을 할까요.

공식 문서를 살펴보면

 

 

reuseIdentifier로 구분해 재사용 가능한 테이블 뷰 셀 객체를 리턴하고 그것을 테이블에 추가해주는 역할을 한다고 합니다.

 

여기서 파라미터로 withIdentifier과 for을 전달합니다.

특히 withIdentifier부분을 보시면 string으로 cellTypeIdentifier를 전달합니다.

하지만 string을 잘못쓰거나, tableview identifier을 잘못 쓰면 오류가 발생합니다.

 

이를 위해서 제네릭과 프로토콜을 활용해 코드 중복을 줄이며 더 개선된 방법으로 코드를 작성할 수 있습니다.

 

먼저 ReusableTableViewCell 프로토콜을 만들어줍니다.

reuseIdentifier 정적 변수를 만들어 줍니다.

 

그리고 ReusableTableViewCell프로토콜을 확장해 reuseIdentifier을 통해 기본 구현을 해줍니다.

reuseIdentifier은 String(describing: self)를 리턴합니다.

내 셀이름이 DayTableViewCell이다. 그럼 DayTableViewCell이 리턴됩니다.

(그래서 모든 tableView에 reuseIdentifier을 자기 이름과 동일하게 변경해줍니다.)

 

다음 UITableView를 확장해 ReusableTableViewCell프로토콜을 채택해줍니다.

 

그럼 UITableView는 ReusableTableViewCell 프로토콜을 채택했으니까 reuseIdentifier를 사용할 수 있습니다.

 

UITableView를 확장시켜줍니다.

 

새롭게 만든 dequeueReusableCell(for: )메소드의 리턴 유형은 제네릭 T입니다.

제네릭 T는 UITableViewCell이라는 조건을 줍니다.

 

즉 dequeueReusableCell(for: )메소드를 사용하면 indexPath만 전달해주어도

알아서 reuseIdentifier로 구분해 테이블 뷰 셀 객체를 전달해줍니다.

 

 

이전에는 guard let구문으로 작성했던 코드는 길고 직관적이지 못했지만,

 

제네릭과 프로토콜을 활용해 직관적이게 줄일 수 있게 되었습니다.

또한 reuseIdentifier로 실수도 줄이고, 코드 중복도 제거할 수 있습니다.

 

 

 

 

'Tech > iOS' 카테고리의 다른 글

프로젝트에 구글 애드몹 추가하는 방법  (0) 2019.08.28
DispatchSemaphore 클래스  (0) 2019.08.22
DispatchGroup 클래스  (0) 2019.08.09
DispatchQueue 클래스  (0) 2019.08.08
iOS NavigationBar 색 변경  (0) 2019.07.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함