swift
swift - Initializer and Deinitializer #5 (Faliable Initializer)
행복하게사는게꿈
2021. 1. 12. 16:21
Nonfailalbe init - 실패를 허용하지 않는 init
그러나??
실패를 허용해야 하는 경우도 존재한다.
예로 파일을 초기화하는 코드같은 경우 파일이 존재한다면 정상적으로 초기화가 진행되겠지만
파일이 존재하지 않거나 어떤 문제로 인해 읽을 수 없다면 runtime err가 발생한다.
Failalbe Init
initializer의 Optional 버전이라고 생각하면 쉽다.
// init? -> 성공시 초기화된 instance가 optional 형식으로 return 실패시 nil
// init! -> 성공시 강제 추출된 NonOptional 형식의 instance 실패시 crush
struct Position {
let x: Double
let y: Double
init?(x: Double, y: Double) {
// 음수면 nil
guard x >= 0.0, y >= 0.0 else { return nil }
self.x = x
self.y = y
}
init!(value: Double) {
guard value >= 0.0 else { return nil }
self.x = value
self.y = value
}
}
let p = Position(x: 12, y: 34)
let p2 = Position(x: -1, y: 0)
// b의 자료형을 명시해주면 자동으로 unwrapped된다
var b: Position = Position(value: 12)
b
// b = Position(value: -1) // 엥? crush 발생하지 않고 nil을 리턴?? IUO 구현이 변경되어서