이니셜라이저
class Person {
var name: String
var age: Int
var nickName: String?
init(name: String, age: Int) {
self.name = name
self.age = age
}
convenience init(name: String, age: Int, nickName: String) {
self.init(name: name, age: age)
self.nickName = nickName
}
}
let hana: Person = Person(name: "hana", age: 20, nickName: "하나")
let jenny: Person = Person(name: "jenny", age: 10)
암시적 추출 optional property가 있는 경우
class Puppy {
var name: String
var owner: Person!
init(name: String) {
self.name = name
}
func goOut() {
print("\(name)가 주인 \(owner.name)와 산책을 합니다")
}
}
let happy: Puppy = Puppy(name: "happy")
happy.owner = jenny
happy.goOut()
실패 가능한 이니셜라이저
class PersonB {
var name: String
var age: Int
var nickName: String?
init?(name: String, age: Int) {
if(0...120).contains(age) == false {
return nil
}
if name.count == 0 {
return nil
}
self.name = name
self.age = age
}
}
let john: PersonB? = PersonB(name: "john", age: 23)
deinit
class PersonE {
var name: String
var pet: Puppy?
var child: Person
init(name: String, child: Person) {
self.name = name
self.child = child
}
deinit {
if let petName = pet?.name {
print("\(name)가 \(child.name)에게 \(petName)를 물려줍니다")
self.pet?.owner = child
}
}
}
var donald: PersonE? = PersonE(name: "donald", child: jenny)
donald?.pet = happy
donald = nil
옵셔널 체이닝
class Person {
var name: String
var job: String?
var home: Apartment?
init(name: String) {
self.name = name
}
}
class Apartment {
var buildingNumber: String
var roomNumber: String
var `guard`: Person?
var owner: Person?
init(dong: String, ho: String) {
buildingNumber = dong
roomNumber = ho
}
}
let yagom: Person? = Person(name: "yagom")
let apart: Apartment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")
func guardJob(owner: Person?) {
if let owner = owner {
if let home = owner.home {
if let `guard` = home.guard {
if let guardJob = `guard`.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
}
}
}
func guardJobWithOptionalChianing(owner: Person?) {
if let guardJob = owner?.home?.guard?.job {
print("우리집 경비원의 직업은 \(guardJob)입니다")
} else {
print("우리집 경비원은 직업이 없어요")
}
}
yagom?.home?.guard?.job
yagom?.home = apart
yagom?.home
yagom?.home?.guard
yagom?.home?.guard = superman
yagom?.home?.guard
yagom?.home?.guard?.name
yagom?.home?.guard?.job
yagom?.home?.guard?.job = "경비원"
nil 병합 연산자
var guardJob: String
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob)
yagom?.home?.guard?.job = nil
guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
print(guardJob)