티스토리 뷰

iOS/Swift

Swift 문법 (7) - 옵셔널

포도 동 2020. 12. 6. 17:55

Swift에선 옵셔널이란 키워드를 사용합니다.

 

1. 옵셔널이란?

- 값이 있을 수도, 없을 수도 있음을 표현합니다.

- nil이 할당될 수 있는지 없는지를 나타냅니다.

// someOptionalParm에 nil이 할당 될 수 있다.
func someFunction(someOptionalParam: Int?) {
       // ....
}

/// someOptionalParm에 nil이 할당 될 수 없다.
func someFunction(someOptionalParam: Int) {
       // ....
}

2. 옵셔널을 쓰는 이유

1) 명시적 표현

- nil의 가능성을 코드만으로 표현이 가능합니다.

- 위의 이유로 문서/주석 작성 시간을 절약할 수 있습니다.

2) 안전한 사용

- 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용할 수 있습니다.

- 예외 상황을 최소화하는 안전한 코딩이 가능합니다.

 

3. 옵셔널 문법과 선언

- 옵셔널 문법 = enum + generics

- 옵셔널 선언

 

- 느낌표(!)를 이용한 암시적 추출 옵셔널

var implicitlyUnwrappedOptionalValue: Int! = 100

switch implicitlyUnwrappedOptionalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

// 기존 변수처럼 사용 가능
implicitlyUnwrappedOptionalValue = implicitlyUnwrappedOptionalValue + 1

// nil 할당 가능
implicitlyUnwrappedOptionalValue = nil

- 물음표(?)를 이용한 옵셔널

var optionalValue: Int? = 100

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

// nil 할당 가능
optionalValue = nil

4. 옵셔널 추출이란?

- 옵셔널에 들어있는 값을 사용하기 위해 꺼내오는 것을 의미합니다.

5. 옵셔널 방식

1) 옵셔널 바인딩

- nil 체크 + 안전한 추출

- 옵셔널 안에 값이 들어있는지 먼저 확인하고, 값이 들어있을 때 값을 꺼내옵니다.

- if - let 방식 사용

func printName(_ name: String) {
    print(name)
}

var myName: String? = nil

//printName(myName) // 컴파일 오류 발생
// 전달되는 값의 타입이 인자의 타입과 다름

if let name: String = myName {
    printName(name)
} else {
    print("myName == nil")
}


var yourName: String! = nil

if let name: String = yourName {
    printName(name)
} else {
    print("yourName == nil")
}

// if-let을 통해 선언한 상수는 구문 내에서만 사용 가능
// 상수 사용범위를 벗어났기 때문에 컴파일 오류 발생
//printName(name)


// ,를 사용해 한 번에 여러 옵셔널을 바인딩할 수 있음
// 모든 옵셔널에 값이 있을 때만 동작함
myName = "TT"
yourName = nil

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않음

yourName = "SS"

if let name = myName, let friend = yourName {
    print("\(name) and \(friend)")
}
// TT and SS 출력

2) 강제 추출

- 옵셔널에 값이 들어있는지 확인하지 않고 강제로 값을 꺼내오는 방식입니다.

- 만약 값이 없을 경우(nil) 런타임 오류가 발생합니다.

var myName: String? = TT
var youName: String! = nil


printName(myName!) // TT 출력
myName = nil

//print(myName!)
// 강제추출시 값이 없으므로 런타임 오류 발생
yourName = nil

//printName(yourName)
// nil 값이 전달되기 때문에 런타임 오류발생

 

* [부스트코스] iOS 프로그래밍을 위한 스위프트 기초 학습 후 정리한 내용입니다.

 

'iOS > Swift' 카테고리의 다른 글

Swift 문법 (9) - 열거형  (0) 2020.12.08
Swift 문법 (8) - 구조체(Struct), 클래스(Class)  (0) 2020.12.07
Swift 문법 (6) - 반복문  (0) 2020.12.06
Swift 문법 (5) - 조건문  (0) 2020.12.03
Swift 문법 (4) - 함수  (0) 2020.12.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함