본문 바로가기
프로그래밍 팁/iOS

dequeueReusableCell을 보다 편리하게 사용하는 방법

by Archivers 2020. 11. 14.

 

 

iOS의 UICollectionView나 UITableView를 사용할 때 보통 dequeueReusableCell를 통해 셀을 재사용합니다. 그런데 이 메소드를 사용할 때마다 셀에 해당되는 identifier를 넘겨 주고 타입 캐스팅까지 해야해서 번거롭고 코드도 지저분해집니다. 따라서 이 과정을 생략할 수 있도록 extension을 정의해 보겠습니다.

 

구현 방법

먼저, identifier를 간편하게 사용하기 위해 UITableViewCell와 UICollectionViewCell에 대한 extension부터 정의합니다.

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

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

위와 같이 스태틱 프로퍼티로 identifier를 정의하면 필요할 때마다 MyCell.identifier와 같은 방식으로 프로퍼티에 접근해서 identifier를 반환 받을 수 있습니다. 이 때 identifier에 해당되는 문자열은 "MyCell"이 됩니다. 특별히 다른 이유가 없는 한, 셀의 identifier는 타입 이름으로 하는 것이 일반적이기 때문에 위처럼 정의하면 identifier를 보다 편리하게 사용할 수 있게 됩니다.

 

그 다음은 dequeueReusableCell 메소드를 보다 간편하게 사용하기 위해 UICollectionView와 UITableView의 extension으로 dequeueCell이라는 메소드를 정의해 보겠습니다.

extension UITableView {
    func dequeueCell<T: UITableViewCell>(type: T.Type, indexPath: IndexPath) -> T {
        guard let cell = dequeueReusableCell(withIdentifier: T.identifier, for: indexPath) as? T else {
            preconditionFailure()
        }
        
        return cell
    }
}

extension UICollectionView {
    func dequeueCell<T: UICollectionViewCell>(type: T.Type, indexPath: IndexPath) -> T {
        guard let cell = dequeueReusableCell(withReuseIdentifier: T.identifier, for: indexPath) as? T else {
            preconditionFailure()
        }
        
        return cell
    }
}

dequeueCell을 호출할 때는 커스텀 셀의 타입을 넘겨 줍니다. 이렇게 받은 타입 T를 사용해서 identifier를 얻는 것과 타입 캐스팅하는 것이 가능해집니다. 이로써 dequeueReusableCell을 사용할 때 필요했던 identifier 작성과 guard let ... as?를 사용한 타입 캐스팅이 모두 extension 내에서 해결되기 때문에 코드가 보다 간결해 질 수 있게 됩니다.

 

preconditionFailure()는 앱의 크래시를 유발하는 메소드이며, 무엇인가를 반환하거나 throw 혹은 break 해야만 하는 guard-else문 내에서 빠져나오기 위한 방법으로도 사용됩니다. 위의 상황에서는 identifier가 등록되지 않았거나 타입 캐스팅이 잘못되었을 때 해당 메소드가 호출되게 됩니다. else 문이 실행될만 한 상황은 개발 과정에서 충분히 확인할 수 있다고 판단하여 이 메소드를 사용했으며, 프로덕션에 나갔을 때 크래시가 발생하면 안 되기 때문에 어느 정도의 사용상의 주의는 필요합니다.

댓글