// Playground - noun: a place where people can play
import UIKit
//Nil Coalescing연산자는 이항 연산자로 a ?? b와 같은 형태로 사용한다.
//왼쪽 피연산자에는 욥셔널 형식의 데이터 또는 표현식이 오고
//오른쪽에는 왼쪽 피연산자가 nil일 경우 리턴할 기본값 또는 표현식이 온다.
func getUserNameFromDB(id: Int) -> String? {
if(id<=0) {
return nil
}
return "James"
}
var james = getUserNameFromDB(123) ?? "John doe"
var someone = getUserNameFromDB(-1) ?? "John doe"
println(james)
println(someone)
//옵셔널 속성을 가진 클래스
class Contact {
var address:String?
var tel:String?
var email:String?
}
class Person {
var contact: Contact?
}
//이런 경우 옵셔널 바인딩을 통해 안전하게 접근해야 한다.
let p = Person()
if let contact = p.contact {
if let email = contact.email {
println(email)
}
else {
println("nil email")
}
} else {
println("nil contact")
}
//이런 경우 너무 불편하므로 옵셔널 체이닝 기능을 지원한다.
let p2 = Person()
var email2 = p2.contact?.email?
println(email2)
//옵셔널 체이닝과 값 쓰기(실패한 경우)
p2.contact?.email? = "kim@naver.com"
if let email = p.contact?.email? {
println(email)
} else {
println("nil email")
}
//이번에는 Contact2에 email에 값이 초기화 되어 있었기 때문에 성공했다.
class Person2 {
var contact:Contact2?
init() {
contact = Contact2()
}
}
class Contact2 {
var address:String?
var tel:String?
var email:String? = "N/A"
}
let p3 = Person2()
p3.contact?.email? = "kim@daum.net"
if let email = p3.contact?.email? {
println(email)
}
//옵셔널 형식으로 자동 변경
//옵셔널 체이닝에서 마지막 요소가 옵셔널이 아닌 경우
class Contact3 {
var address:String?
var tel:String?
var email:String = "lee@daum.net"
}
class Person3 {
var contact:Contact3?
init() {
contact = Contact3()
}
}
//옵셔널 체이닝의 결과로 리턴되는 값을 자료형은 항상 옵셔널 형식이다.
//그래서 마지막 부분에 있는 email의 자료형이 String이지만 실제로 리턴되는
//값은 String?이 된다.
let p4 = Person3()
let email = (p4.contact?.email)!
if let email = p4.contact?.email {
println(email)
}
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.