2014년 12월 22일 월요일

애플의 새로운 개발언어 Swift - 옵셔널#5

// 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)
}



댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

Xcode 26의 새로운 기능들

 애플의 AI준비에 대한 골든타임이 지나가고 있다는 말이 많이 들립니다. ㅎㅎ  애플의 그동안의 패쇄적인 환경을 생각하면 온디바이스AI나 LLM환경에서 다소 아쉬운 부분이 많이 있습니다. 다른 빅테크들과 전혀 다른 방향의 목소리를 내고 있어서 좀 우려...