Swift에서 Struct, Class, Enum을 초기화할 수 있는 Initializer에 대해서 알아보자. Deinitializer는 class에서만 사용이 가능하다. 이 부분에서 class 초기화는 다른 언어의 초기화 과정과 약간 다른 부분이 있다. 해당 내용은 좀 길어질 수 있어 다음 포스팅으로 넘겼다. 이번에는 Value type, Reference type의 초기화 과정에 대해 개괄적이 내용을 알아보는 것을 목적으로 한다. 그럼 시작하자.
class, struct, enum 사용 가능
stored property 초기화 및 instance 사용 위한 초기화
initailier라는 method 사용
return value 없음
class의 경우 init, deinit을 쌍으로 가짐
Optional Property의 경우 반드시 초기화할 필요 없음
Constant(let
) Property는 initialization 과정에서 반드시 초기화 되어야 함
struct의 경우, init을 따로 정의하지 않으면 자동으로 memberwise initializer가 만들어짐
failable initializer
init?
으로 사용가능함
잘못된 parameter나 외부 resource가 존재하지 않는 경우
override 해서 non-failable initializer로 만들 수 있음
class Document {
var name: String?
init() {}
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
class AutomaticallyNamedDocument: Document {
override init(name: String) {
super.init()
if name.isEmpty {
self.name = "[untitled]"
} else {
self.name = name
}
}
}
Closure를 통한 default property value setting이 가능함
class SomeClass {
let someProperty: SomeType = {
// setting
return someValue
}
}
struct Size {
var width = 0.0, height = 0.0
}
let a = Size(width: 3, height: 4)
let b = Size(width: 10)
print(a.width, a.height)
print(b.width, b.height)
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point() // 0.0, 0.0
var size = Size()
// init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - size.width/2
let originY = center.y - size.height/2
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
Size()
도 생성이 되었지만Rect()
는 생성되지 않는다는 것convenience init(parameters) {
//statements
}
required
사용required
사용해야 함deinit
키워드 사용