새소식

iOS/Swift

[Swift] 옵셔널(Optional)

  • -
참조 :  Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)

 

옵셔널(Optional)


- Swift의 특징 중 하나인 안전성을 문법으로 담보하는 기능

- 값이 있을 수도 없을 수도 있음을 나타내는 표현

- 변수 또는 상수의 값이 nil일 수도 있다는 것

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

- 옵셔널 변수 또는 상수 등은 데이터 타입 뒤에 물음표(?)를 붙여 표현

 

var myName: Optional<String> // 옵셔널 선언
var myName: String? // 같은 의미지만 이것을 더 사용

- 옵셔널을 사용하는 상황

  1. 만든 함수에 전달되는 전달인자의 값이 잘못된 값인 경우
    → nil을 반환하여 오류가 있음을 알릴 수 있음
  2. 매개변수를 굳이 넘겨도 되지 않는다는 뜻으로 매개변수 타입을 옵셔널로 정의하는 경우

 

- 옵셔널은 열거형으로 구성

- 옵셔널은 값을 갖는 경우와 그렇지 못한 경우 두 가지로 정의

  1. 값을 가지는 경우 → some 케이스, 연관값으로 Wrapped가 있음
  2. 값을 가지지 않는 경우 → non케이스

- 여러 케이스의 조건을 통해 검사를 하고자 한다면 where절과 병합하여 사용하면 더욱 유용하게 사용 가능

 

let numbers: [Int?] = [2, nil, -4, nil, 100]

for number in numbers{
	switch number{
    case .some(let value) where value < 0:
    	print("Negative value!! \(value)")
    case .some(let value) wheree value > 10:
    	print("Large value!! \(value)")
    case .some(let value):
    	print("Value \(value)")
    case .none:
    	print("nil")
    }
}
// Value 2
// nil
// Negative value!! -4
// nil
// Large value!! 100

 

 

 

옵셔널 추출


- 강제추출(Forced Unwrapping) : 옵셔널 값에! 을 붙여 값을 강제로 추출하여 반환, 런타임 오류가 일어날 가능성이 높아                
가장 간단한 방법이지만 가장 위험한 방법

- 옵셔널 바인딩 : 옵셔널 값이 있는지 확인할 때 사용, 옵셔널 값이 있다면 옵셔널에서 추출한 값을 일정 블록 안에서 사용할 수 있는   
상수나 변수로 할당해서 옵셔널이 아닌 형태로 사용할 수 있게 해 줌, if나 while구문과 결합하여 사용                                             

  1. 임시 상수를 사용할 때는 if 블록 밖에서는 사용할 수 없고 else 블록에서도 사용 불가
  2. 변수로 사용하고 싶다면 if var을 통해 임시 변수로 할당할 수 있음
  3. 쉼표를 사용하여 한번에 여러 옵셔널 값을 추출 가능 → 옵셔널 중 하나라도 값이 없다면 해당 블록 내부의 명령문 실행 안됨

var myName: String? = "kim"

// 옵셔널 바인딩을 통한 임시 상수 할당
if let name = myName{	// let 선언
	print(" My name is \(name)")
}else{
	print("my name == nil")
}
// My name is kim

// 옵셔널 바인딩을 통한 임시 변수 할당
if var name = myName{ 	// var 선언
	name = "son"
    print("My name is \(name)")
}else{
	print("My name == nil")
}
// My name is son

 

 

 

 

암시적 추출 옵셔널


- 옵셔널 바인딩으로 매번 값을 추출하기 귀찮거나 로직상 nil 때문에 런타임 오류가 발생하지 않을 것 같다는 확신이 들 때 nil을
할당해줄 수 있는 옵셔널이 아닌 변수나 상수

- 느낌표(!)를 이용하여 사용

 

// 암시적 추출 옵셔널의 사용
var myName: String! = "kim"
print(myName) // kim
myName = nil

// 암시적 추출 옵셔널도 옵셔널이므로 당연히 바인딩을 사용할 수 있음
if let name = myName{
	print("My name is \(name)")
}else{
	print("myName == nil")
}
// myName == nil

myName.isEmpty // 오류
728x90

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

[Swift] 구조체와 클래스  (0) 2022.09.16
[Swift] 모나드  (0) 2022.09.16
[Swift] 함수  (0) 2022.09.14
[Swift] 연산자  (0) 2022.09.14
[Swift] 맵, 필터, 리듀스  (0) 2022.09.14
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.