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
을(를) 사용하지않고 다른 방법으로 구현해보는 방법에 대해 알아보려합니다.
공식문서에서 확인해보면 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에 아래와 같이 적용해봅니다.
static let identifier = String(describing: HomeViewCell.self) // HomeViewCell
앞의 코드처럼 직접 Magic Literal로 그때마다 작성하여 Human Error
를 발생할 수 있는 부분을 잡아낼 수 있겠습니다.
그럼 이제 모든 준비는 마쳤으며 P.O.P를 통한 reusable하게 사용하는 방법을 알아보고자합니다.
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
}
}
이제 위 코드에서 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. 재사용이 가능하다는 점이 장점인 것 같습니다.
위 내용을 코드에 적용시켜줄 수 있게 도움을 주신 리뷰어 제이슨님께 감사하다는 말씀으로 글을 마칩니다.
감사합니다!