class Test {
var a: Int! // nil로 초기화
var b: Int? // nil로 초기화
var c: Int // init으로 초기화
var d: Int // error
init(tmp: Int) {
self.c= tmp
}
}
1) 초기화 메소드 델리게이션: super.init()
class A{
var a: Int
init(value: Int) {
self.a = value
}
}
class B: A{
init(value1: Int, value2: Int) {
super.init(value: value1)
}
}
class C: B {
init(value1: Int, value2: Int, value3: Int) {
super.init(value1: value1, value2: value2)
}
}
2) 지정 초기화 메소드 (Designated Initializer)
class A{
var a: Int
init(value: Int) {
self.a = value
}
required init (val1: Int, val2: Int, val3: String){
self.a = val1
}
}
class B: A{
required init(val1: Int, val2: Int, val3: String) {
super.init(value: val1)
}
}
3) 편의 초기화 메소드 (Convenience Initializer)
class A{
var a: Int
var name: String!
init(val1: Int, val2: String) {
self.a = val1
self.name = val2
}
convenience init(newVal: Int) {
self.init(val1: newVal, val2: "imustang")
}
}
서브 클래싱시, 수퍼 클래스에서 Init 키워드로 작성된 것은 꼭 super.init으로 초기화 필요
1) 오버리딩 : 같은 이름의 메소드, 다른 매개변수 or 다른 리턴 타입
(안할 시 a변수가 초기화 안된 상태로 남아있음)
class A{
var a: Int
init(inValue: Int) {
self.a = inValue
}
}
class B: A{
var b: Int
init(inValue: Int, inValue2: Int) {
self.b = inValue2
super.init(inValue: inValue)
}
}
2) 오버라이딩: 메소드 이름, 매개변수, 리턴타입 모두 같아야함
서브클래싱시, 수퍼클래스와 같은 촉;화 이름으로 할 땐 override init으로 선언
class A{
var a: Int
init(inValue: Int) {
self.a = inValue
}
}
class B: A{
var b: Int
override init(inValue: Int) {
self.b = inValue
super.init(inValue: inValue)
}
}
항상 init 메소드를 남발하는 경향이 있었는데, 클래스의 초기화가 필요한 변수에 대해 정확히 initializer 메소드를 구현하고 서브 클래싱 시 필요에 따라 require init을 작성하는 연습이 필요하다.