- This topic has 5개 답변, 2명 참여, and was last updated 4 years, 7 months 전에 by 야곰.
-
글쓴이글
-
-
광현참가자
- 글작성 : 15
- 답글작성 : 26
IB를 이용해 CollectionView를 만들고 CustomCell을 만드는 데까지 성공은 했는데, CustomCell 내부의 오토레이아웃이예상했던 것만큼 예쁘게 나오지 않아서 IB와 코드로 같이 작성하려고 하는데요.
이 사이트를 참조해서 https://rngo.ca/article/create-custom-uicollectionviewcell-in-swift
클래스를 작성하고 위 CustomCell을 이용하는 ViewController에서 UICollectionViewDelegate 프로토콜을 준수한 뒤,
문제 없이 실행될 것이라고 예상했었는데 콘솔창에서 required init? 구현 부분이 호출되면 오류가 발생하네요.
코드와 IB 혼용 문제인지 아니면 다른 구현이 미흡한지 궁금합니다.
2020-04-27 오후 9:28 #7279 -
광현참가자
- 글작성 : 15
- 답글작성 : 26
init 상속 부분을 다시 상기하려 공부하는 데 시간이 조금 오래 걸렸네요.
[클래스의 구분]
- 클래스에서는 지정 이니셜라이져와 편의 이니셜라이져로 역할이 구분된다.
- 지정 이니셜라이져(Designated Initializer)는 필요에 따라 부모클래스의 이니셜라이져를 호출할 수 있고, 이니셜라이져가 정의된 클래스의 모든 프로퍼티를 초기화 해야한다. 모든 클래스는 하나 이상의 지정 이니셜라이져를 갖는다.
- 편의 이니셜라이져(Convenience Initializer)는 초기화를 조금 더 손쉽게 도와주는 역할을 한다. 편의 이니셜라이져는 필수 요소는 아니다. 편의 이니셜라이져는 앞에 ‘convenience’ 지정자를 init 키워드 앞에 명시해주면 된다.
[이니셜라이져 상속 및 재정의]
- 기본적으로 스위프트의 이니셜라이져는 부모클래스의 이니셜라이져를 상속받지 않는다. 이는 자식클래스의 새로운 인스턴스가 완전하고 정확하게 초기화 되지 않는 상황을 방지하고자 함이다.
- 부모클래스와 동일한 지정 이니셜라이져를 자식클래스에 구현해주려면 재정의(override)를 하면 된다. init 앞에 override를 붙이면 된다.
- 부모클래스와 동일한 편의 이니셜라이져를 자식클래스에서 구현할 때는 override 수식어를 붙이지 않는다. 자식 클래스에서는 절대 부모의 편의 이니셜라이져를 호출할 수 없기 때문이다.
[이니셜라이져 자동 상속]
스위프트에서는 자식클래스는 부모 클래스의 이니셜라이져를 상속 받지 않는다. 그러나 조건에 부합한다면 부모클래스의 이니셜라이져가 자동상속된다.
- 규칙1 : 자식클래스에서 별도의 지정 이니셜라이져를 구현하지 않는다면 부모클래스의 지정 이니셜라이져가 자동상속되낟.
- 규칙2: 부모클래스의 지정 이니셜라이져를 모두 재정의하여 부모클래스와 동일한 지정 이니셜라이져를 모두 사용할 수 있는 상황이라면 부모클래스의 편의 이니셜라이져가 모두 자동 상속된다.
[요구 이니셜라이져]
required 수식어를 클래스의 이니셜라이져 앞에 명시해주면 이 클래스를 상속받은 자식클래스에서 반드시 해당 이니셜라이져를 구현해야한다. 다만 자식클래스에서 요구 이니셜라이져를 재정의할 때는 override 수식어 대신 required 수식어를 사용한다.
[fatalerror]
fatalError는 애플 공식문서에서는 너무 간단히 함수 설명만 나와 있어서 다른 개발자분들 블로그를 참고했습니다.
fatalError는 Assertion 용도의 함수 중 하나이다. Assertion은 복구불가능한 에러를 출력하는 것?이다. 복구가능한 에러와 복구 불가능한 에러를 나눠 개발자가 대응할 수 있도록 해주는 것이라고 이해했는데 맞는지 모르겠네요.
본래 질문에서 저는 required init에 fatalError를 발생시켜서 앱이 바로 종료했고, dequeReusableCell에서 required init이 아니라 override init이 호출된다고 생각한 게 잘못된 거 같은 데 맞나요?
2020-04-28 오후 9:49 #7358 -
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
네, 그렇습니다. 스토리보드 및 xib 등 인터페이스 빌더를 사용하여 인터페이스를 구성한 경우 셀의
init
및awakeFromNib
메서드 등 코드로 인스턴스를 생성한 것과는 다른 단계를 거치게 됩니다.인터페이스 빌더를 사용하여 인터페이스를 구성한 후 빌드하여 실행하면 인터페이스를 xml에서 nib 바이너리로 인코딩 해뒀던 것을 런타임에 디코딩 해와서 인스턴스를 생성하게 되는데 이 때 사용하는 이니셜라이저가 코더를 사용한 이니셜라이저입니다.
아래 두 개의 글을 참고해보면 좋을 것 같습니다 🙂
- 이 답변은 야곰에 의해 4 years, 7 months 전에 수정됐습니다.
2020-04-28 오후 10:17 #7360 -
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.