[Swift] 옵셔널

ds-k.mo·2022년 4월 29일
0

Swift

목록 보기
5/22

옵셔널이란?

값이 있을 수도 있고 없을 수도 있다.

지정하는 방법

변수의 타입을 설정할때 ?키워드를 삽입하고, nil을 할당해준다.

var number:Int? = nil
var name:String? = nil

값이 없는 변수에 접근을 하면 다른 언어에서는 일반적으로 런타임 에러가 발생하지만, swift에서 옵셔널로 설정한 변수에는 접근해도 오류가 발생하지 않는다.

  • 옵셔널로 선언된 값의 형태
var optionalName: String? = "Daeseong"
print(optionalName) // Optional("Daeseong")

Optional("Daeseong")
-> 이처럼 바로 String이 아니라 Optional이라는 포장지에 둘러쌓인 형태로 나온다. 이 변수를 사용하기 위해서는 옵셔널 바인딩이라는 과정이 필요하다.

옵셔널의 해제 방법

  1. 명시적 해제
  • 강제 해제
  • 비강제 해제(옵셔널 바인딩)
  1. 묵시적 해제
  • 컴파일러에 의한 자동 해제
  • 옵셔널의 묵시적 해제

명시적 해제 - 강제해제

옵셔널 해제 연산자 !를 통해 해결할 수 있다.

var number: Int? = 11
print(number) // Optional(11)
print(number!) // 11

강제해제는 만약 값이 nil인 변수를 강제 해제할 경우 오류가 발생하게 되므로 위험하다.

명시적 해제 - 옵셔널 바인딩

if문과 guard문을 통해 바인딩 할 수 있다.

var number: Int? = 3

// if 문
if let result = number {
    print(result)
} else {
    // 값 추출이 실패할 경우
} // 3

// guard 문
func test() {
    let number: Int? = 5
    guard let result = number else { return }
    print(result)
}

test() // 5

묵시적 해제 - 컴파일러에 의한 자동 해제

비교연산자를 이용해서 다른 값이랑 비교하면 컴파일러가 자동으로 해제하게 된다.

let value : Int? = 10

if value == 10 {
    print("value는 10이다")
} else {
    print("Nah..")
}

묵시적 해제 - 옵셔널의 묵시적 해제

let string = "12"
var stringToInt: Int! = Int(string)
print(stringToInt) // Optional(12)
print(stringToInt + 1) // 13

// ? Case...
let string = "12"
var stringToInt: Int? = Int(string)
print(stringToInt)
print(stringToInt + 1) // Error : Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
// 해제가 안되는 것을 볼 수 있다.

string을 Int화시킬 때 string이 숫자가 아닌 경우
nil이 되기 때문에 Optional로 타입을 지정할 필요가 있음
이때 옵셔널 ? 대신 !을 사용하면 옵셔널을 묵시적으로 해제한 상태로 사용할 수 있음.

0개의 댓글