개발하는 뚝딱이

[swift] 옵셔널 본문

swift

[swift] 옵셔널

개발자뚝딱이 2020. 4. 28. 21:57

책 <스위프트 프로그래밍 3판 ;야곰 지음> 을 정리한 글입니다.

 


옵셔널

1. 옵셔널의 사용

2. 옵셔널 추출

2-0. 강제추출

2-1. 옵셔널 바인딩

2-2. 암시적 추출 옵셔널


 

 

- 옵셔널은 스위프트의 특징 중 하나인 안정성을 담보로 하는 문법 기능 중 하나

- 변수나 상수의 값이 nil일 수도 있음을 표현

- 옵셔널과 옵셔널이 아닌 값은 완전히 다른 타입

 

 

1. 옵셔널의 사용

- nil은 옵셔널 선언된 곳에서만 사용이 가능

var yourName: String? = "Jason"
var hisName: Optional<String> = "Jess"

var myName: String = "Jin"
myName = nil // 오류!

 

- 옵셔널은 제네릭이 적용된 열거형

- nil일 때는 none 케이스

- 값이 있는 경우 some 케이스 ; 연관 값인 Wrapped가 할당됨

public enum Optional<Wrapped>: ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    public init(_ some: Wrapped)
    /// 중략...
}

 

- switch를 통한 옵셔널 값의 확인

func checkOptionalValue(value optionalValue: Any?) {
    switch optionalValue {
    case .none:
        print("This Optional variable is nil")
    case .some(let value):
        print("Value is \(value)")
    }
}

var myName: String? = "Jason"
checkOptionalValue(value: myName) // Value is Jason

myName = nil
checkOptionalValue(value: myName) // The Optional variable is nil

 

 

2. 옵셔널 추출

- 옵셔널의 값을 옵셔널이 아닌 값으로 추출하는 옵셔널 추출 (Optional Unwrapping)

 

2-0. 강제추출

- Forcaed Unwrapping

- 값이 없을 경우 런타임 오류가 일어나는 위험한 방법

- 옵셔널 값의 뒤에 느낌표(!)를 붙여주면 강제로 값을 추출하여 반환

var myName: String? = "Jin"

var jin: String = myName!

myName = nil
jin = myName! // 런타임 오류

// if 조건문을 이용하여 안전하게 처리
if myName != nil {
    print("My name is \(myName!)")
} else {
    print("myName == nil")
}

 

2-1. 옵셔널 바인딩

- Optional Binding

- 옵셔널에 값이 있다면, 추출한 값을 일정 블록 안에서 사용할 수 있는 상수나 변수로 할당하여 사용 가능

- if 또는 while 구문과 결합하여 사용

- 옵셔널 바인딩을 통해 여러 개의 옵셔널 값을 한 번에 추출할 수 있으나, 하나라도 nil 값이면 추출되지 않음

var myName: String? = "Jin"

if let name = myName {
    print("My name is \(name)")
} else {
    print("myName == nil")
}

var yourName: String? = nil

// 옵셔널 바인딩을 사용해 여러 개의 옵셔널 값 추출
if let name = myName, let friend = yourName {
    print("We are friend! \(name) & \(friend)")
}

 

2-2. 암시적 추출 옵셔널

- Implicitly Unwrapped Optionals

- 옵셔널을 표시하고자 하는 타입 뒤에 물음표가 아닌 느낌표 사용

- 가끔 nil을 할당하고 싶지만, 옵셔널 바인딩으로 값을 추출하는게 귀찮거나 로직상 nil 때문에 런타임 오류가 발생하지 않을 것 같다는 확신이 들 때 사용

- 일반 변수처럼 사용이 가능하며, nil 할당과 옵셔널 바인딩도 가능

- 값이 nil일 때 사용하면 오류 발생

var myName: String! = "Jin"
print(myName) // Optional(Jin)
myName = nil

if let name = myName { // myName == nil
    print("My name is \(name)")
} else {
    print("myName == nil")
}

myName.isEmpty // 오류 발생

var num: Int! = 100
num += 1 // 변수처럼 사용 가능

'swift' 카테고리의 다른 글

[swift] 접근제어  (0) 2020.05.02
[swift] 인스턴스 생성 및 소멸  (0) 2020.05.01
[swift] 메소드 (method)  (0) 2020.04.27
[swift] 프로퍼티(property)  (0) 2020.04.15
[swift] 구조체(struct)와 클래스(class) 비교  (0) 2020.04.08