기존에 tableViewCell이나 collectionViewCell의 reuseIdentifier를 사용하기 위해서는 문자열을 통해 접근해야 했다.
그렇다보니 발생하는 문제점은 휴먼에러.. 그니까 오타..!로 인해 찾지 못한다는 점
1. 타입 프로퍼티 각 클래스 파일에 작성하기
각 클래스마다 타입 프로퍼티를 만들어서 초기에 인스턴스를 생성해서 접근했다.
매번 클래스 만들 때마다 작성해줘야 하는 것과 각 클래스 파일에
들어가서 하나하나 체크해줘야 하는 게 번거롭다.
2. Constant 구조체 내에 모든 클래스의 타입 프로퍼티 모아두기
두 번째 방법으로는 Constant라는 구조체 파일에 모든 클래스의 타입 프로퍼티를 작성해서 접근하는 방식으로 만들어줬다.
이 방식의 장점은 모든 클래스들의 identifier가 모아져있어서 변경할 때 편리하다는 점
근데 단점은 결국 이 아이도 문자열을 작성해줘야 하는 것
3. ReusableViewProtocol
String(describing: 클래스명.self)
모든 타입의 인스턴스를 문자열로 변환해줌
// WebViewController.self 메타 타입 => "WebViewController"
static var reuseIdentifier: String = String(describing: WebViewController.self)
클래스의 경우 self를 꼭 붙여서 가능하다.
protocol ReusableViewProtocol {
static var reuseIdentifier: String { get }
}
ReusableViewProtocol을 하나 만들어서 각 클래스마다 채택하고 프로토콜 프로퍼티를 구현해줄 수도 있지만
같은 기능을 하는 경우라면 extension을 통해 초기 정의를 해줄 수 있다.
extension UIViewController: ReusableViewProtocol {
static var identifier: String {
get {
return String(describing: self)
}
}
}
extension 내에서는 저장 프로퍼티가 불가능하기 때문에 연산 프로퍼티 형식으로 작성한다.
그리고 get만 하나 구현해주는 경우라면 생략이 가능하기 때문에 아래와 같이 작성해줘도 무방하다.
extension UIViewController: ReusableViewProtocol {
static var identifier: String {
return String(describing: self)
}
}
이런 식으로 구현 시에 결과적으로 UIViewController를 상속받고 있는 모든 클래스에서 따로 해당 코드를 작성하지 않더라도
아래처럼 작성할 수 있게 된다.
UITableViewCell의 경우도 마찬가지다.
protocol ReusableViewProtocol {
static var identifier: String { get }
}
extension UITableViewCell: ReusableViewProtocol {
static var identifier: String {
return String(describing: self)
}
}
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] Alamofire, SwiftyJSON을 사용해서 HTTP 통신하기 (0) | 2022.08.02 |
---|---|
[Swift] Singleton Pattern (0) | 2022.08.02 |
[Swift] Class와 Struct 그리고 부스러기 개념들 (0) | 2022.07.29 |
[Swift] 스위프트 성능 이해하기1 - Struct / Class (0) | 2022.07.29 |
[iOS] DataSource, Delegate | TextView Placeholder | WebKit (0) | 2022.07.29 |