
타입캐스팅은 인스턴스의 타입을 확인하거나 해당 인스턴스를 슈퍼클래스나 서브클래스로 취급하는 방법입니다.
as? (조건부 다운캐스팅)// 예시
if let cell = collectionView.dequeueReusableCell(...) as? FrameWorkCell {
// cell이 FrameWorkCell 타입인 경우에만 실행
}
nil 반환as! (강제 다운캐스팅)let cell = collectionView.dequeueReusableCell(...) as! FrameWorkCell
as (업캐스팅)let view: UIView = UIButton() as UIView
// 일반적인 UICollectionViewCell을 FrameWorkCell로 타입캐스팅
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameWorkCell",
for: indexPath) as? FrameWorkCell else {
return UICollectionViewCell()
}
델리게이트는 "위임"이라는 의미로, 특정 객체가 해야 하는 일을 다른 객체에게 위임하는 디자인 패턴입니다.
책임 분리
프로토콜 기반
// 1. 델리게이트 설정
class FrameWorkListViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self // 자신을 델리게이트로 지정
collectionView.dataSource = self // 자신을 데이터소스로 지정
}
}
// 2. 델리게이트 메서드 구현
extension FrameWorkListViewController: UICollectionViewDelegate {
// 셀이 선택되었을 때 호출되는 메서드
func collectionView(_ collectionView: UICollectionView,
didSelectItemAt indexPath: IndexPath) {
// 셀 선택 시 동작 구현
}
}
식당에서의 주문 과정을 예로 들어보겠습니다:
// 실제 코드가 아닌 개념 설명을 위한 예시
protocol 웨이터Delegate {
func 주문받기()
func 음식가져다주기()
}
class 손님 {
var 웨이터: 웨이터Delegate?
func 배고프다() {
웨이터?.주문받기() // 웨이터에게 주문 위임
}
}
class 웨이터: 웨이터Delegate {
func 주문받기() {
// 주문 받는 로직
}
func 음식가져다주기() {
// 음식 서빙 로직
}
}
UICollectionViewDelegate
UICollectionViewDataSource
UICollectionViewDelegateFlowLayout
// 예시
extension FrameWorkListViewController: UICollectionViewDataSource {
// 몇 개의 셀을 보여줄지
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return list.count
}
// 각 셀을 어떻게 구성할지
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
// 셀 구성 로직
}
}
이러한 델리게이트 패턴은 코드를 더 모듈화하고 유지보수하기 쉽게 만들어줍니다.