[Swift] 옵셔널(Optional)

Annie Kang·2022년 7월 7일
0

Swift

목록 보기
1/9

안녕하세요, Annie 입니다 :)

이번에 Swift에만 도입된 새로운 개념, 옵셔널 (Optional)에 대해
공부해보겠습니다.

1. 옵셔널이란?


옵셔널이란 옵셔널로 감싸진 값을 가지고 있거나 nil 을 가지고 있다는 것을 나타내는 타입이다.
쉽게 말해서 옵셔널이란, 어떤 변수(상수)가 값을 가질 수도 있고 nil 값을 가질 수도 있음을 알려주는 표현방법 이다.

옵셔널 값이 nil이 아닌 경우, 값은 Optional로 감싸져 있기 때문에,
unwrapping 하여 값을 사용해야 한다 (옵셔널 바인딩)


2. 옵셔널 표현 방식

옵셔널 값을 나타내기 위해 변수의 타입에 ?를 붙이거나
Optional<> 으로 나타낼 수 있다.

let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")

위의 두 변수는 모두 옵셔널 Int값을 가진다.


3. 옵셔널 체이닝


옵셔널 값으로 감싸져있는 속성이나 메서드에 ?를 붙여 옵셔널를 벗길 필요 없이 값에 접근 하는 방법.

if imagePaths["star"]?.hasSuffix(".png") == true {
 print("The star image is in PNG format")
}

위의 코드를 보면 imagePaths["star"]에 ?를 붙임 으로써 옵셔널 값을
벗겨낼 필요 없이 값이 접근 할 수 있다.

? 없이 imagePaths["star"].hasSuffix(".png") 로 작성하는 경우
에러가 발생한다.


4. 옵셔널 바인딩


옵셔널 객체를 새로운 변수에 담으면서, 옵셔널 값을 벗겨내는 방법.
'if let', 'guard let','switch' 를 이용하여 옵셔널 바인딩을 할 수 있다.

  • ! 를 이용한 강제언래핑

    변수 뒤에 바로 ! 를 붙여 강제로 optional을 벗기는 방법이다.
    가장 간단하고 명료하지만, nil값이 있을 가능성이 1%라도
    있다면 optional이 벗겨지지 않고 앱이 꺼진다..
    nil 값이 아니라는 확신이 있을 때만 사용할 것 !
class SecondViewController: UIViewController {

    
    @IBOutlet weak var textColorButton: UIButton!
    @IBOutlet weak var sendButton: UIButton!
    
    @IBOutlet weak var resultLabel: UILabel!
    @IBOutlet weak var userTextField: UITextField!
    
    @IBOutlet var buttonList: [UIButton]!
  • if let 구문

    if let 구문 뒤에 새로운 변수에 옵셔널 값을 담고 사용함으로써
    옵셔널을 벗겨낼 수 있다. 비교적 안전한 방법이다.
if let starPath = imagePaths["star"] {
    print("The star image is at '\(starPath)'")
} else {
    print("Couldn't find the star image")
}
  • guard let 구문

    if let 구문과 비슷하지만 함수나 loop를 벗어나는 경우에 주로 쓰인다.
func printMeaningOfLife() {
    guard let name = getMeaningOfLife() else {
        return
    }
    print(name)
}

nil 인 경우에 return 을 함으로써 함수를 빠져나갈 수 있다는게
if let 과 다른 부분이다.

  • Switch 구문

    옵셔널 값은 .some(value값) 과 .none(nil)으로 이루어진
    열거형이라고 볼 수 있다. switch 문을 이용하여 아래와 같이
    옵셔널 값을 벗길 수 있다.
let capital: String? = "London"

switch capital {
case .none:
  print("value is nil")
case .some(let capital):
  print("value is \(capital)")
}

참고 :

profile
성장하는 iOS 개발자

0개의 댓글

관련 채용 정보