[swift] IGListKit의 예외 처리 방법

IGListKit은 iOS를 위한 유명한 데이터 드리븐 UI 프레임워크입니다. IGListKit은 CollectionView의 사용을 간편하게 만드는 동시에 데이터 업데이트와 관련된 복잡한 로직을 처리해주는 많은 기능을 제공합니다. 하지만 때로는 IGListKit 사용 중에 발생할 수 있는 예외를 제대로 처리해야 할 경우도 있습니다.

이제 IGListKit에서 발생하는 예외 처리에 대해 알아보겠습니다.

1. IgListExceptionCatch

IGListKit에서는 예외 처리를 위해 IgListExceptionCatch이라는 헬퍼 클래스를 제공합니다. 이 클래스를 사용하면 IGListKit에서 발생하는 예외를 캐치하여 처리할 수 있습니다.

예를 들어, 다음과 같은 코드가 있다고 가정해봅시다.

let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
adapter.collectionView = collectionView

위의 코드에서 adapter.collectionViewcollectionView를 설정할 때, 만약 collectionView가 nil인 경우 예외가 발생할 수 있습니다. 이 경우 IgListExceptionCatch를 사용하여 예외를 처리할 수 있습니다.

let adapter = ListAdapter(updater: ListAdapterUpdater(), viewController: self)
IgListExceptionCatch.tryBlock {
    adapter.collectionView = collectionView
}.catchBlock { exception in
    print("collectionView가 nil입니다: \(exception)")
}

위의 예제에서는 tryBlock 내에서 adapter.collectionView를 설정하려고 시도하고, 예외가 발생하면 catchBlock에서 해당 예외를 처리합니다.

2. IgListBindException

IGListKit의 다른 예외 처리 클래스는 IgListBindException입니다. 이 클래스는 IgListKit에서 데이터 바인딩 중 발생하는 예외를 처리하는 데 사용될 수 있습니다.

예를 들어, IgListKit 사용 중에 다음과 같은 코드를 작성했다고 가정해봅시다.

func cellForItem(at index: Int) -> UICollectionViewCell {
    guard let cell = collectionContext?.dequeueReusableCell(of: MyCell.self, for: self, at: index) 
        as? MyCell else {
        fatalError("예상하지 못한 셀 가져오기에 실패했습니다.")
    }
    return cell
}

위의 코드에서 dequeueReusableCell 메서드가 셀을 가져오지 못한 경우, 예상하지 못한 상황으로 판단하고 fatalError가 발생합니다.

이 경우 IgListBindException를 사용하여 예외를 처리할 수 있습니다.

func cellForItem(at index: Int) -> UICollectionViewCell {
    defer {
        do {
            try IgListBindException.catchException {
                guard let cell = collectionContext?.dequeueReusableCell(of: MyCell.self, 
                    for: self, at: index) as? MyCell else {
                    throw IgListBindException.error("예상하지 못한 셀 가져오기에 실패했습니다.")
                }
            }
        } catch {
            print("셀 가져오기 예외 처리: \(error)")
        }
    }
    // 셀을 반환하거나 예외 처리된 경우 해당 블록으로 이동됩니다.
    ...
}

위의 예제에서는 collectionContext?.dequeueReusableCell 호출 내에서 발생하는 예외를 catchException 메서드를 사용하여 캐치하고, throw 구문을 사용하여 예외를 던집니다. 이후 catch 블록에서 해당 예외를 처리할 수 있습니다.

참고 자료