구조체 생성자의 종류에는 지정 생성자가 있다.
아래는 지정 생성자의 특징이다.
구조체는 지정 생성자만 존재하고 편의 생성자가 없기 때문에 아래와 같은 생성자 문법만 사용가능하다.
구조체(값타입)의 경우 아래와 같이 생성자에서 다른 생성자를 호출할 수 있다.
struct Color1 {
let red, green, blue: Double
// 지정 생성자
init() {
// red = 0.0
// green = 0.0
// blue = 0.0
// 구조체는 다른 생성자를 호출할 수 있다
self.init(red: 0.0, green: 0.0, blue: 0.0)
}
// 지정 생성자
init(white: Double) {
// red = white
// green = white
// blue = white
// 구조체는 다른 생성자를 호출할 수 있다
self.init(red: white, green: white, blue: white)
}
// 지정 생성자
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
구조체의 지정 생성자에서 다른 지정 생성자를 호출하는 방식으로 구현할 경우 프로퍼티 값을 중복 초기화 하는 경우가 없어 개발단계 또는 유지보수할때 문제 발생 가능성이 줄어든다. 그래서 이와 같은 방식으로 생성자를 사용하게 된다.
클래스의 경우 지정 생성자와 편의 생성자 모두 사용가능하다.
지정 생성자는 구조체와 동일하므로 편의 생성자의 특징만 알아보겠다.
모든 프로퍼티를 초기화 하는 지정 생성자가 있다면 편의 생성자를 이용해 생성자를 구성하는 것을 권장한다. 생성자의 중복을 없애고 다른 지정 생성자를 호출하는 패턴을 이용하는것이 복잡도나 실수를 줄일 수 있기 때문이다.
class Color2 {
let red, green, blue: Double
// 편의 생성자
convenience init() {
self.init(red: 0.0, green: 0.0, blue: 0.0)
}
// 편의 생성자
convenience init(white: Double) {
self.init(red: white, green: white, blue: white)
}
// 지정 생성자
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}