1. Optional 사용 기본 예제 및 강제언래핑

 

var a : String? = "Star"
print(a)

// 강제 언래핑 Force Unwrapping
var b : String
b=a!
print(b)

var c : String? = nil
print(c)

!를 사용해 강제 언래핑하는 것은 좋은 코드가 아니다. 왜냐하면 nill이 들어있을 수도 있는 것에 강제로 언래핑을 하는 것이므로...

 

 

 

 

 

2. 옵셔널 바인딩(Optional Binding)의 if let을 활용한 기본 예제

 

if let 을 활용합니다.

 

if let xx = x 라고 했을 경우, x가 nil이 아니라면 optional 안에 가지고 있는 값을 xx에 넣습니다.

그래서 print("x = \(xx)")의 결과값이 optional(10)이 아니라 10이 되었습니다.

print("x is actually \(x)")의 결과값으로는 optional(10)이 됩니다.

 

let x : Int? = 10
let y : Int? = nil

if let xx = x {
    print("x = \(xx)")
    print("x is actually \(x)")
}
else {
    print("x is Optional")
}

if let yy = y {
    print("y = \(yy)")
    print("y is actually \(y)")
}

 

 

 

 

 

3. if let을 활용한 여러 옵셔널을 바인딩(Optional Binding)하는 예제

 

 - nil이 있는 경우 : name2=nil

let name1 : String? = "Kim"
let name2 : String? = nil

if let nameFirst = name1,
   let nameSecond = name2 {
    print(nameFirst, nameSecond)
}
else {
    print("optional~")
}

 

 - nil이 없는 경우 : name2="Lee"

let name1 : String? = "Kim"
let name2 : String? = "Lee"

if let nameFirst = name1,
   let nameSecond = name2 {
    print(nameFirst, nameSecond)
}
else {
    print("optional~")
}

 

 

 

 

 

4. guard let을 활용한 옵셔널 바인딩(Optional Binding) 예제

 

guard let의 else문 마지막에는 항상 return이나 throw가 와야합니다.

본 예제는 함수 안에 있으므로 return을 사용했습니다.

let name1 : String? = "Kim"
let name2 : String? = nil

func opbindung_example() {
    guard let nameFirst = name1 else {
        return print("name1 is Optional!")
    }
    print(nameFirst)
    
    guard let nameSecond = name2 else {
        return print("name2 is Optional!")
    }
    print(nameSecond)
}

opbindung_example()

 

 - guard letif let과 다른 점은, let 줄에서 선언한 변수가 지역변수가 아닌 전역변수라는 것입니다.

그래서 if let에서 선언한 변수는 if let 안에서만 사용이 가능하고, guard let에서 선언한 변수는 밖에서도 사용이 가능합니다.

let name1 : String? = "Kim"

func opbinding_sample() {
    guard let nameFirst = name1 else {
        return print("name1 is Optional!")
    }
    print(nameFirst)
}

opbinding_sample()

let name1 : String? = nil

func opbinding_sample() {
    guard let nameFirst = name1 else {
        return print("name1 is Optional!")
    }
    print(nameFirst)
}

opbinding_sample()

 

 

 

 

 

5. 옵셔널 체이닝(Optional Chaining)

 

struct Contacts {
    var email : String
    var address : [String : String]
}

struct Person {
    var name : String
    var contacts : Contacts
    
    init(name : String, email_2 : String, address_2 : String) {
        self.name = name
        contacts = Contacts(email:email_2, address:["home":address_2])
    }
}

var my : Person? = Person(name: "Song", email_2 : "123@gmail.com", address_2:"Seoul")

print(my)
print(my?.name)
print(my?.contacts.email)
print(my?.contacts.address)
my = nil
print(my?.name)
print(my?.contacts.email)
print(my?.contacts.address)

 

 

 

 

 

6. Optional Binding & Optional Chaining (옵셔널 바인딩과 옵셔널 체이닝 함께 활용)

 

struct Contacts {
    var email : String
    var address : [String : String]
}

struct Person {
    var name : String
    var contacts : Contacts
    
    init(name : String, email_2 : String, address_2 : String) {
        self.name = name
        contacts = Contacts(email:email_2, address:["home":address_2])
    }
}

var my : Person? = Person(name: "Song", email_2 : "123@gmail.com", address_2:"Seoul")

if let my_email = my?.contacts.email {
    print("I have an email : \(my_email)")
} else {
    print("Nono!")
}
func binding() {
    guard let my_address = my?.contacts.address else {
        return print("Nonono!")
    }
}


print(" - Making my To nil")
my = nil

if let my_email = my?.contacts.email {
    print("I have an email : \(my_email)")
} else {
    print("Nono!")
}
func binding_ex() {
    guard let my_address = my?.contacts.address else {
        return print("Nonono!")
    }
}

binding_ex()

 

 

 

 

 

7. nil 병합 연산자(nil coalescing operator)

 

nil 병합 연산자(nil coalescing operator)를 활용하기 이전에, 강제 언래핑과 옵셔널 바인딩의 간단한 예시를 살펴보겠습니다.

 

 - 강제 언래핑시 다음과 같습니다.

var test : Int? = 5
print(test)
print(test!)

 - 옵셔널 바인딩 사용시 다음과 같습니다.

var test : Int? = 5
print(test)

if let test2 = test {
    print(test2)
} else {
    let test2 : Int = 0
    print(test2)
}

 - nil 병합 연산자(nil coalescing operator) 사용시 다음과 같습니다. : 대상이 nil이 아닌 경우

var test : Int? = 5
print(test)

var test2 : Int = test ?? 0

var test3 : Int
test3 = test ?? 0

print(test2)
print(test3)

 - nil 병합 연산자(nil coalescing operator) 사용시 다음과 같습니다. : 대상이 nil인 경우

var test : Int? = nil
print(test)

var test2 : Int = test ?? 0

var test3 : Int
test3 = test ?? 0

print(test2)
print(test3)

 

 

 

 

 

8. 암시적으로 벗겨진 옵셔널 (Implicitly Unwrapped Optional)

 

// 일반적인 옵셔널
var A : Int? = 1

// 암시적으로 벗겨진 옵셔널
var a : Int! = 1

print(A)
print(a)

 

일반적인 옵셔널과의 차이를 알아보겠습니다.

// 암시적으로 벗겨진 옵셔널
let a : Int! = 1
print(a)

let b : Int = a
print(b)

let c : Int = a!
print(c)

let d = a
print(d)

let e = a + 8
print(e)

 

type도 확인해볼 수 있습니다.

// 암시적으로 벗겨진 옵셔널
let a : Int! = 1
print(type(of:a))

let b : Int = a
print(type(of:b))

let c : Int = a!
print(type(of:c))

let d = a
print(type(of:d))

let e = a + 8
print(type(of:e))

Implicitly Unwrapped Optional(암시적으로 벗겨진 옵셔널)을 사용한다고 모든 경우에서 문제가 없는 것은 아니다. nil인 경우 결국에는 오류가 발생하기에 강제 언래핑과 유사한 면이 있어 주의해서 사용해야한다.

// 암시적으로 벗겨진 옵셔널
let a : Int! = nil
print(a)

//let b : Int = a
//print(b)

//let c : Int = a!
//print(c)

let d = a
print(d)

//let e = a + 8
//print(e)

 

+ Recent posts