이 내용은 챗 지피티와 아래의 블로그를 사용해서 공부한 것입니다!
https://babbab2.tistory.com/168
Swift) 초기화(Initializers) 이해하기 (2/6) - 클래스의 초기화(Designated / Convenience)
안녕하세요 :) 코들입니다.. 코로나에 걸려 죽다 살아 돌아온 소들이라 볼 수 있습니다 아직도 마지막 잎새마냥 기침하며 포스팅 적는 중.. ...뭐야 위 세 줄 쓴 뒤로 3주지남.. 진짜 죽었었나.. 쨌
babbab2.tistory.com
클래스의 초기화
1. 클래스를 초기화하는 방법
- 클래스 초기화 시점에 모든 프로퍼티들은 기본 값을 가지고 있어야한다. 기본값 없으면 인스턴스 생성 실패
- 선언과 동시에 프로퍼티에 기본값 넣어주기
- 프로퍼티 타입을 옵셔널타입의 변수로 설정하기
- let은 안됨
- 생성자 안에서 프로퍼티의 값을 설정해주기
- 구조체는 프로퍼티에 기본값이 없어도 에러가 안난다.
- 구조체는 초기화되지 않은 프로퍼티를 초기화 시킬 수 있도록 자동으로 제공하는 생성자인 Memberwixe Initializers가 있다.
2. 클래스의 initializers
class Human {
let name: String
init(name: String) {
self.name = name
}
}
class Sodeul: Human {
let alias: String
init(alias: String) {// error! 'super.init' isn't called on all paths before returning from initializer
self.alias = alias
}
}
- Designated Initializers(지정 생성자)
- 해당 생성자 메서드가 종료 될때 까지 모든 프로퍼티는 초기값을 지니고 있어야한다.
- 반드시 super.class의 생성자를 호출해야한다.
- 자식 클래스에서 지정생성자에 self.init()만 넣으면 부모 클래스에서 기본값이 없는 프로퍼티가 있을 때 에러가 나기 때문에 이를 방지하기 위해 super.init()을 넣는다.
class Sodeul {
var name: String
var nickName: String
init(name: String, nickName: String) {
self.name = name
self.nickName = nickName
}
convenience init(name: String) {
self.init(name: name, nickName: "unknown")
}
}
- Convenience Initializers( 편의 생성자)
- 모든 프로퍼티를 초기화할 필요 없는 생성자이다.
- 반드시 다른 초기화를 호출시켜야한다.
- 슈퍼 클래스의 생성자는 호출 시킬 수 없다.
- 같은 클래스내에 있는 Convenience Initializers나 Designated Initializers를 호출 시켜야 한다.
- 최종적으로는 같은 클래스 내의 Designated Initializers가 호출되어야 한다.
- 따라서 Convenience init을 사용하려면 Designated initailizers가 구현되어 있어야함.
- 최종적으로 Convenience initializers에서 Designated Initializers를 호출하지 않으면 에러난다.
- self' used before self.init call or assignment to 'self'
- self.name = a 와 같이 프로퍼티를 바꿔 주는 것은 다른 생성자를 부르고 바꿔야함
- 다른 초기화를 부르기전에 값을 설정하면 다른 초기화에 의해 값이 덮어지는 문제가 발생할 수
'ios' 카테고리의 다른 글
storekit 공부하기 (0) | 2024.12.06 |
---|---|
15. URLRequest (0) | 2024.04.16 |
12. Clean Architecture (iOS) (0) | 2023.12.24 |
11. 동기화 공부하기 (0) | 2023.12.13 |
10. ios의 frame과 bounds (0) | 2023.12.11 |