로부터 문서
안전 점검 1
지정된 이니셜 라이저는 클래스가 도입 한 모든 속성이 수퍼 클래스 이니셜 라이저로 위임되기 전에 초기화되어야합니다.
왜 이런 안전 점검이 필요한가요?
이에 대한 답을 얻으려면 초기화 과정을 신속하게 진행하십시오.
2 단계 초기화
Swift의 클래스 초기화는 2 단계 프로세스입니다. 첫 번째 단계에서는 저장된 각 속성에 속성을 도입 한 클래스에 의해 초기 값이 할당됩니다. 모든 저장된 속성의 초기 상태가 결정되면 두 번째 단계가 시작되고 새 클래스를 사용할 준비가 된 것으로 간주되기 전에 각 클래스에 저장된 속성을 사용자 지정할 수있는 기회가 주어집니다.
2 단계 초기화 프로세스를 사용하면 클래스 계층 구조의 각 클래스에 완전한 유연성을 제공하면서 초기화가 안전 해집니다. 2 단계 초기화는 속성 값이 초기화되기 전에 속성 값에 액세스 하지 못하게하고 다른 초기화 프로그램이 속성 값을 예기치 않게 다른 값으로 설정하지 못하게합니다.
따라서 2 단계 초기화 프로세스가 위에 정의 된대로 수행되도록하기 위해 4 가지 안전 점검이 있습니다.
안전 점검 1
지정된 이니셜 라이저는 클래스가 도입 한 모든 속성이 수퍼 클래스 이니셜 라이저로 위임되기 전에 초기화되어야합니다.
이제 2 단계 초기화는 순서에 대해 이야기하지 않지만이 안전 검사 super.init
는 모든 속성을 초기화 한 후에 순서를 지정합니다.
안전 점검 1은 2 단계 초기화로 인해이 안전 점검 1없이 속성 값을 초기화하기 전에 액세스 할 수 없도록 하기 때문에 관련이없는 것처럼 보일
수 있습니다.
이 샘플 에서처럼
class Shape {
var name: String
var sides : Int
init(sides:Int, named: String) {
self.sides = sides
self.name = named
}
}
class Triangle: Shape {
var hypotenuse: Int
init(hypotenuse:Int) {
super.init(sides: 3, named: "Triangle")
self.hypotenuse = hypotenuse
}
}
Triangle.init
사용하기 전에 모든 속성을 초기화했습니다. 안전 점검 1은 관련이없는 것 같습니다.
하지만 약간 복잡한 시나리오가있을 수 있습니다.
class Shape {
var name: String
var sides : Int
init(sides:Int, named: String) {
self.sides = sides
self.name = named
printShapeDescription()
}
func printShapeDescription() {
print("Shape Name :\(self.name)")
print("Sides :\(self.sides)")
}
}
class Triangle: Shape {
var hypotenuse: Int
init(hypotenuse:Int) {
self.hypotenuse = hypotenuse
super.init(sides: 3, named: "Triangle")
}
override func printShapeDescription() {
super.printShapeDescription()
print("Hypotenuse :\(self.hypotenuse)")
}
}
let triangle = Triangle(hypotenuse: 12)
출력 :
Shape Name :Triangle
Sides :3
Hypotenuse :12
여기에서 super.init
를 설정하기 전에를 호출했다면 호출은를 호출했을 것이고 hypotenuse
, 그 이후에는 우선의 삼각형 클래스 구현으로 대체 될 것입니다 . 삼각형 클래스 액세스는 비 선택적 특성 아직 초기화되지 않았습니다. 그리고 2 단계 초기화로 인해 속성 값이 초기화되기 전에 액세스 할 수 없으므로 허용되지 않습니다.super.init
printShapeDescription()
printShapeDescription()
printShapeDescription()
hypotenuse
따라서 2 단계 초기화가 정의 된대로 수행되고, 특정 호출 순서 가 있어야하며, 즉 클래스에 super.init
의해 도입 된 모든 속성을 초기화 한 후 안전 점검이self
필요합니다.