스위프트에서 클래스는 2단계의 초기화 과정을 가진다. 첫번째 단계에서는 저장 프로퍼티의 초기 값이 할당 되고 두번째 단계는 저장 프로퍼티의 값을 변경할 기회를 주어진다. 이러한 과정을 거치는 이유는 프로퍼티의 초기값이 초기화가 완료되기 이전에 예상하지 못한 다른 값으로 변경되는 것을 막아주기 때문에 안전하게 초기화를 할 수 있기 때문이다. 초기화 도중 오류를 막기 위해 컴파일러는 4가지의 safety check을 한다.
초기화 1단계에서 지정 생성자(Designated Initializer)는 부모 클래스의 생성자로 넘어가기 전 현재 클래스의 저장 프로퍼티의 초기값이 설정되어 있는지 확인한다.
지정 생성자는 상속받은 프로퍼티의 값이 할당되기 전에 부모 클래스의 생성자로 넘어가야 한다.(delegate up) 만약 safety check 2를 하지 않고 부모 클래스의 생성자로 넘어가기 전에 상속받은 프로퍼티의 값을 바꿨다고 생각해보자. 초기화 1단계에서 하위 클래스 생성자에서 safety check 1을 하고 부모 클래스의 생성자로 넘어가는데 현재 클래스에서 상속받은 프로퍼티 값이 바뀐 이후에 부모 클래스의 생성자로 넘어갈 것이고 부모 클래스 생성자 속에 있는 코드에 의해 그 프로퍼티의 값은 덮어씌여질 것이다.
보조 생성자(Convenience Initializer)는 어느 프로퍼티든 그 프로퍼티의 값이 할당되기 전에 다른 생성자로 넘어가야 한다. 마찬가지로 safety check 3를 하지 않는다면 초기화 1단계 순서에 의해 그 클래스의 지정 생성자가 보조 생성자가 할당한 프로퍼티의 값을 덮어씌울 것이다.
생성자는 초기화 1단계가 끝나기 전에는 인스턴스 메소드를 호출하거나 인스턴스 프로퍼티의 값을 읽거나 self 키워드를 사용할 수 없다. 클래스 인스턴스는 초기화 1단계가 끝나기 전에는 완전히 유효하지 않기 때문이다.