Cell의 identifier를 좀 더 reusable하게 사용해보자!

Jason·2023년 5월 11일
0

Overview

Cell의 identifier를 좀 더 reusable하게 사용해보자는 타이틀을 진행하기 앞서 일반적인 사용 방법에 대해 얘기해보려고합니다.
일반적으로 CollectionView 또는 TableView를 사용할 때 Cell을 구성하는 일은 필연적인 부분입니다.
보통 아래와 같이 구현합니다.

final class HomeViewCell: UICollectionViewCell {
    
    static let identifier = "HomeViewCell"
    
    //MARK: - Initializer
    override init(frame: CGRect) {
        super.init(frame: frame)
        
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        
    }
    ...
}

이때 위와 같이 identifier를 직접 String 타입으로 Magic Literal을(를) 사용하게되는 경우가 처음 학습하는 단계에서 많이 사용하게되며
필자 또한 이 글을 적기 이전까지는 위와 같이 사용하였습니다.
먼저 Magic Literal을(를) 사용하지않고 다른 방법으로 구현해보는 방법에 대해 알아보려합니다.

🅰️ String(describing: Subject) 사용하기

공식문서에서 확인해보면 Subject라는 타입으로 명시되어있음을 확인할 수 있습니다.
Subject에 대해서는 따로 설명되어있는 부분이 없으며 링크 또한 없기에 위 메서드의 정의를 통해서 유추해보았습니다.

Creates a string representing the given value.
주어진 값을 나타내는 문자열을 만듭니다.

조금 더 자세한 설명을 보면

Use this initializer to convert an instance of any type to its preferred representation as a String instance.
이 이니셜라이저를 사용하여 모든 유형(type)의 인스턴스를 String 인스턴스 표현으로 변환합니다.

그렇다면 원하는 주제 즉, Subject에 넣어서 반환되는 값은 모두 String 타입이 될 수 있다고 보았습니다.

Cell identifier에 적용해보기

그렇다면 위 코드의 Cell의 identifier에 아래와 같이 적용해봅니다.

static let identifier = String(describing: HomeViewCell.self)       // HomeViewCell

앞의 코드처럼 직접 Magic Literal로 그때마다 작성하여 Human Error를 발생할 수 있는 부분을 잡아낼 수 있겠습니다.
그럼 이제 모든 준비는 마쳤으며 P.O.P를 통한 reusable하게 사용하는 방법을 알아보고자합니다.

🅱️ P.O.P 살짝 맛보기

Protocol Oriented Programming 을(를) 사용하여 채택하여 구현하기보다는 extension을 사용하여
아래와 같이 구현할 수 있다는 점은 알고있으실겁니다.

protocol Convertible {
    var receiveCurrentDate: String { get }
}

extension Convertible {
    var receiveCurrentDate: String {
        
        guard let date = Calendar.current.date(byAdding: .day, value: -1, to: Date()) else {
            return ""
        }

        let formatter = DateFormatter()
        formatter.dateFormat = MagicLiteral.dateFormat
        let currentDateString = formatter.string(from: date)

        return currentDateString
    }
}

💡 Cell의 identifier에 적용해보기

이제 위 코드에서 identifier에 String(describing:) 메서드와 함께 이용해 볼 수 있을 것 같습니다.

// 구현부
protocol Gettable {
    static var identifier: String { get }
}

extension Gettable {
    static var identifier: String {
        return String(describing: self)
    }
}

// 호출부 예시
collectionView.register(BoxOfficeListCell.self, forCellWithReuseIdentifier: BoxOfficeListCell.identifier)

이렇게 작성하였을때의 가장 큰 장점을 크게 2가지로 느껴집니다.
1. 아래와 같이 Cell에서 코드를 사용하지않아도 Cell의 identifier를 사용할 수 있다는 점
2. 재사용이 가능하다는 점이 장점인 것 같습니다.

위 내용을 코드에 적용시켜줄 수 있게 도움을 주신 리뷰어 제이슨님께 감사하다는 말씀으로 글을 마칩니다.
감사합니다!

🌐 Reference Site

init(describing:) | Apple Developer Documentation

profile
🧑🏼‍💻 iOS developer

0개의 댓글