지정생성자
- init(...) { } 의 형태를 가지는 생성자
- 지정생성자는 모든 저장속성을 초기화해야함
- 모든 저장속성이 초기화되는 경우 따로 지정하지 않아도 기본생성자 자동으로 제공
- 오버로딩 가능
class Color {
var red: Double
var blue: Double
var green: Double
// 지정생성자
// 모든 저장속성을 초기화 한다
init(red: Double, blue: Double, green: Double) {
self.red = red
self.blue = blue
self.green = green
}
}
class Color1 {
var red: Double = 0.0
var blue: Double = 0.0
var green: Double = 0.0
// 모든 저장속성에 초기값이 있을경우 기본생성자 자동제공
// init() { }
}
생성자에서 생성자 호출
- 구조체에서는 생성자에서 다른 생성자를 호출가능
- 클래스에서는 다른 생성자를 호출하고 싶은경우 편의생성자를 이용해야함
struct Color { // 구조체
var red: Double
var blue: Double
var green: Double
init(red: Double, blue: Double, green: Double) {
self.red = red
self.blue = blue
self.green = green
}
init(white: Double) {
// 다른 생성자를 호출할수 있다
// 클래스에선 오류남
self.init(red: white, blue: white, green: white)
}
}
편의생성자
- 지정생성자보다 적은 개수의 파라미터로 편리하게 생성하기 위한 생성자
- 편의생성자는 지정생성자에 의존
- 그렇기때문에 편의생성자는 반드시 다른 편의생성자 혹은 지정생성자를 호출해야함
(궁극적으로는 지정생성자 호출)

- 클래스에서만 사용가능하며 convenience 키워드를 붙여서 사용
class Color {
var red: Double
var blue: Double
var green: Double
init(red: Double, blue: Double, green: Double) { // 지정생성자
self.red = red
self.blue = blue
self.green = green
}
convenience init(white: Double) { // 편의생성자
// 받아온 파라미터값으로 지정생성자를 호출하여 초기화하고있다
self.init(red: white, blue: white, green: white)
}
convenience init() { // 편의생성자
// init(white:) (편의생성자) 를 호출하고 있다
// init(white:)에서 지정생성자를 호출하기 때문에
// 궁극적으론 지정생성자를 호출하게 된다
self.init(white: 0.5)
}
}
