클래스, 구조체 enum에서 initializer를 만들 수 있다.
class someClass {
init() {
}
}
- initializer를 통해 초깃값을 할당하거나, default value로 초기화될 때에는 property observer method(willSet, didSet)가 호출되지 않는다.
기본 이니셜라이저
init을 통해서는 사용자 정의 이니셜라이저를 만들어주는 거다.
따로 init을 구현하지 않으면 기본 이니셜라이져를 이용하게 된다.
기본 이니셜라이져는 저장 프로퍼티의 기본값이 모두 지정되어 있고, 동시에 사용자 정의 이니셜라이져가 정의되어있지 않은 상태에서 제공된다.
- 구조체는 사용자 정의 이니셜라이저를 구현하지 않으면 프로퍼티의 이름으로 매개변수를 갖는 memberwise initializer를 기본으로 제공한다. (클래스는 안제공함)
초기화 위임
값 타입인 구조체와 열거형은 이니셜라이저가 다른 이니셜라이저에 일부 초기화를 위임하게 할 수 있다. 클래스는 간단한 초기화 위임도 할 수 없다.
이니셜라이저가 다른 이니셜라이저를 호출할 때에는 self.init 을 이용한다. 사용자 정의 이니셜라이저를 정의하면 기본 이니셜라이저와 멤버와이즈 이니셜라이즈를 이용할 수 없다. 즉, 기본 또는 멤버와이즈 이니셜라이저에 초기화를 위임하는 것은 불가능하다.
실패 가능한 이니셜라이저 Failable initializer
클래스, 구조체, 열거형에 모두 사용 가능한 이니셜라이저. 초기화에 실패할 경우 nil 을 리턴하므로 반환 타입은 optional이다. 잘못된 전달인자를 전달받았을 때 초기화에 실패할 수 있다.
init 대신 init? 키워드를 사용한다. 초기화에 성공한 경우에는 return 을 그냥 이용하고, 실패할 경우에는 return nil
- enum’s failable initializer
enum Student: String {
case elementary, middle, high
init?(age: Int) {
switch age {
case 8...13:
self = .elementary
case 14...16
self = .middle
case 17...19
self = .high
default:
return nil
}
}
함수를 사용한 프로퍼티 기본값 설정
연산을 통해 stored property의 디폴트 값을 설정하고 싶을 때 클로저나 함수를 사용할 수 있다. 인스턴스 초기화시 클로저가 호출되면서 연산의 결과값을 기본값으로 제공해준다.
클로저의 반환 타입과 프로퍼티의 타입은 일치해야하고, 해당 클로저가 실행되는 시점은 인스턴스의 다른 프로퍼티 값이 설정되기 전이기 때문에 다른 프로퍼티의 값을 이용할 수 없다. 같은 이유로 self를 사용하거나 인스턴스 메서드를 호출하는 것도 불가하다.
class SomeClass {
let someProperty: SomeType = {
//
return someValue
}() // 소괄호를 통해 해당 클로저를 실행해준다.
}
클래스에서는 Deinitializer를 구현할 수 있다. 클래스 인스턴스가 메모리에서 소멸되기 바로 직전에 호출되는 함수이다. func 키워드 없이, deinit 키워드를 사용하여 구현한다. 클래스 인스턴스에서만 구현 가능하다.
소멸되기 전에 저장된 데이터를 디스크에 파일로 저장하는 등의 작업을 할 때 유용하다.
- 하나의 클래스에서 deinit 은 하나만 구현 가능하다.
- 모든 프로퍼티에 접근 가능하다.