VesselWheel

Optional type 선언(?), 해제(!) 본문

Xcode Study

Optional type 선언(?), 해제(!)

JasonYang 2023. 5. 3. 08:38

import UIKit

 

/*

 Optional (옵셔널)

 

 Int type

 Optional Int type

 

 */

 

// Int type 의 값 할당하기

var n1: Int = 10

 

// Optional Int type 의 값 할당하기

//  ㄴ Int type 의 값을 할당하거나

//     아무 값도 할당되지 않은 상태(nil)

var n2: Int? = 20

var n3: Int!

var n4: Int! = 40

 

print(n1)

print(n2)

 

// 갑을 할당하지 않으면 자동으로 nil 로 설정됨

print(n3)

print(n4)

 

 

print(Int(100))

print(100)

 

// Optional(1234)

print(Int("1234"))

 

// 값을 사용하려면 Optional 을 풀어줌 : !

// 1234

print(Int("1234")!)

 

// 숫자모양의 문자열이 아니면 nil 로 출력됨

// 값을 반환할 때 오류가 발생할 가능성이 있는 값은

// Optional type 이라는 객체로 감싸서 반환함

// print(Int("swift"))

 

// swift 에서 기본자료형(Int, Double, String ...)

// 들은 nil 값을 저장할 수 없음

// nil 을 저장하려면 Optional type 으로 선언해야 함

// 아래의 n5 는 정수나 nil값 모두 할당받을 수 있음

var n5: Int?

 

var n6: Int?

var n7: Int = 70

 

print(n6)

print(n7)

 

var n8: Int? = 80

print(n8)

print(n8!)

 

n8 = n8! + 100

print(n8)

print(n8!)

 

var n9: Int = 90

print(n9)

 

 

// n8! <-- forced unwrapping

n9 = n8!

print(n9)

print("-----------------")

 

var n10: Int?

n10 = 10

 

if n10 != nil{

    print(n10!)

}else{

    print("nil")

}

 

var n11: Int?

if n11 != nil{

    print(n11!)

}else{

    print("nil")

}

print("-----------------")

 

var n12: Int?

n12 = 12

 

// if let n12_1 = n12 에서 ! 를 사용하지 않아도

// n12(Optional(12)) 가 unwrapping 이 됨

 

// Optional Binding

if let n12_1 = n12{

    print(n12, n12_1)

}else{

    print("nil")

}

print("-----------------")

 

var n13: Int?

n13 = 13

 

// swift 5.7 부터 n13_1 = n13 이라고 하지 않아도

//  unwrapping 이 됨

if let n13{

    print(n13)

}else{

    print("nil")

}

 

// n14 에 n13_1=n13 같이 값을 할당하지 않으면

// n14 는 nil 이 됨

var n14: Int?

if let n14{

    print(n14)

}else{

    print("nil")

}

 

/*

 여러 Optional 변수를 한꺼번에 unwrapping 하기

   ㄴ , (comma) 사용

 */

var fruit1: String?

var fruit2: String?

fruit1 = "strawberry"

fruit2 = "melon"

if let fruit1, let fruit2{

    print(fruit1, fruit2)

}else{

    print("nil")

}

 

var number1: Int?

var number2: Int?

number1 = 11

number2 = 22

if let number1, let number2{

    print(number1, number2)

}else{

    print("nil")

}

 

/*

 Optional 선언 : ?

 Optional 해제 : !

 Optional 에 값이 할당되어 있는 것이 보장된 경우,

    ㄴ nil 이 아닌 것이 보장된 경우

 implicity unwrapped  (묵시적(암묵적) 언래핑)

                         자동

  ㄴ 이 경우, 강제 언래핑이나 Optional Binding

    을 하지 않아도 값에 접근할 수 있도록 함

 

  ㄴ 암묵적 언래핑 Optional로 선언하려면

     선언부에서 ! 를 사용함

 */

var n15: Int? = 10

var n16: Int = n15!

var n17 = n15

 

// Optional(10) 10 Optional(10)

print(n15, n16, n17)

 

// Implicity Unwrapped Optional 선언하기

var n18: Int! = 22

// 자동으로 unwrapping 됨

var n19: Int = n18

// ! 을 사용해서 명시적(expliity) unwrapping 함

var n20: Int = n18!

// type 추론에 의해서 n21 도 n18 과 같이 Optional 로 인식함

var n21 = n18

// n18 은 ! 을 사용해서 선언했으므로

// 연산할 때 자동으로 unwrapping 됨

var n22 = n18 + 10

print(n18, n19, n20, n21, n22)