//: Playground - noun: a place where people can play
import Swift
// 예제 클래스
// 사람 클래스
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 myName: Person? = Person(name: "myName")
let apart: Apartment? = Apartment(dong:"102", ho:"303")
let superman: Person? = Person(name: "superman")
// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로 결과 타입도 옵셔널입니다.
// 만약 우리집의 경비원의 직업이 궁금하다면?
// 옵셔널 체이닝을 사용하지 않는다면...
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("우리집 경비원은 직업이 없어요")
}
}
}
}
}
guardjob(owner:myName)
// 옵셔널 체이닝을 사용한다면
func guardJobWithOptionalChaining(owner:Person?){
if let guardJob = owner?.home?.guard?.job{
print("우리집 경비원의 직업은 \(guardJob)입니다")
}else {
print("우리집 경비원은 직업이 없어요")
}
}
guardJobWithOptionalChaining(owner: myName)
// 우리집 경비원은 직업이 없어요
myName?.home?.guard?.job // nil
myName?.home = apart
myName?.home //Apratment
myName?.home?.guard //nil
// 경비원 할당
myName?.home?.guard = superman
myName?.home?.guard //Person
myName?.home?.guard?.name //superman
myName?.home?.guard?.job //nil
myName?.home?.guard?.job = "경비원"
/*
- nil 병합 연산자
중위 연산자입니다.??
optional ?? value
옵셔널 값이 nil일 경우, 우측의 값을 반환합니다.
띄어쓰기에 주의하여야 합니다.
*/
var guardJob: String
guardJob = myName?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 경비원
myName?.home?.guard?.job = nil
guardJob = myName?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨
'Swift > 기초&문법' 카테고리의 다른 글
swift library alamofire papago 번역 파파고 스위프트 라이브러리 (0) | 2018.09.25 |
---|---|
스위프트 타입 캐스팅 swift type casting (0) | 2018.09.24 |
swift weather 날씨앱 로컬 딕셔너리 사용 스위프트 (0) | 2018.09.22 |
swift tableView cell 선택했을 때 화면 이동 스위프트 테이블뷰 (1) | 2018.09.21 |
swift custom tableview 스위프트 커스텀 테이블뷰 (0) | 2018.09.20 |