//Required Initializer
class Person{
let name: String
init(name: String) {
self.name = name
}
}
class Member: Person {
var point = 0
}
required initializer
을 사용한다.required init(name: String) {
self.name = name
}
required initializer
이 필요하다는 에러가 발생한다.class Member: Person {
var point = 0
init() {
point = 0
super.init(name: "unknown")
}
required init(name: String) {
point = 0
super.init(name: name)
}
}
required init
을 사용할 때에는 슈퍼클래스의 required init과 완전히 동일한 형태여야 한다. 즉, 매개변수가 같아야 한다.Non-Failable Initializer
이라고 한다.Failable Initializer
을 사용한다면 컴파일에러나 런타임 에러가 발생하지 않고 nil로 초기화된다.init?
이나 init!
을 사용하면 된다.init?
: 초기화에 성공했을 때 인스턴스를 옵셔널 형식으로 리턴, 실패 시 nil 리턴init!
: 초기화에 성공했을 때 인스턴스를 non-optional 형식으로 리턴. 실패 시 크래시 발생. (비추천)struct Position {
let x: Double
let y: Double
init?(x: Double, y: Double){
guard x >= 0.0, y >= 0.0 else {
return nil // 초기화에 실패했다는 의미로 nil을 리턴
}
self.x = x
self.y = y
}
init!(value: Double){
guard value >= 0.0 else {
return nil // 초기화에 실패했다는 의미로 nil을 리턴
}
self.x = value
self.y = value
}
}
IUO
타입으로 리턴된다.IUO
타입은 값이 자동으로 unwrapping 된다.