Swift 5 : Optional

budlebee·2020년 7월 14일
0

Swift

목록 보기
1/10

Optional
변수 또는 상수에 값이 할당되지 않은 상황을 처리하기 위한 방법.

변수를 선업할때 데이터 타입 선언 다음에 ?를 붙이면 옵셔널이 된다.

var index: Int?

index 라는 변수는 정수값이 할당되거나 아무런 값도 할당되지 않을 수 있다. 내부적으로 컴파일러의 관점에서 어떤 값도 할당되지 않은 옵셔널은 nil 값을 갖는다.

옵셔널에 값이 할당되었다면 해당 값이 옵셔널 내에서 래핑되었다(wrapped)고 말한다.

래핑된 값은 강제 언래핑(forced unwrapping)을 통해 값을 뽑아 쓸 수 있다. 옵셔널 이름 뒤에 느낌표 !를 붙여서 값을 뽑아쓴다.

var index: Int?
index=3
var testArray=["zero","one","two","three"]

if index != nil {
	print(testArray[index!])
} else {
	print("index does not contain a value")
}

여기서 testArray([index]) 처럼 쓸 경우, 느낌표 ! 를 빠뜨릴 경우 컴파일러가 에러를 띄운다.

강제 언래핑 대신, 옵셔널 바인딩(optional binding)을 통해 옵셔널에 할당된 값을 임시 변수나 상수에 할당할 수 있다.

var index: Int?
index=3
var testArray=["zero","one","two","three"]

if let myValue = index {
	print(testArray[myValue])
} else {
	print("index does not contain a value")
}

index 라는 옵셔널이 값을 가지고 있다면, myValue 라는 임시 상수에 값이 할당된다. myValue 는 if 문 내에서만 유효한 임시 상수로써, 다음과 같은 코드도 유효하다.

if let index = index {
	print(testArray[index])
}

옵셔널 바인딩은 다음 구문처럼 여러개의 옵셔널을 언래핑하고 조건문을 포함하는데 사용할 수 있다.

var pet1: String?
var pet2: String?
pet1="cat"
pet2="dog"

if let firstPet = pet1, let secondPet = pet2, petCount > 1 {
	print(firstPet)
    print(secondPet)
} else {
	print("something wrong!")
}

여기서, petCount 에 할당된 값이 1보다 크지 않다면 옵셔널 바인딩이 수행되지 않는다.

옵셔널을 선언할때 강제적으로 언래핑 되도록 선언할 수 있다. 옵셔널을 선언할 때 물음표 ? 대신 느낌표 ! 를 붙여주면 된다.

var index: Int!
index=3
var testArray=["zero","one","two","three"]

if index != nil {
	print(testArray[index])
} else {
	print("index does not contain a value")
}

if 문 내에서 index 뒤에 느낌표를 붙이지 않아도 문제없이 사용할 수 있다.

swift 에서 할당된 값이 없거나 nil 값을 가질 수 있는 것은 옵셔널 타입뿐이다. 그외 타입에 nil 값을 할당하면 컴파일러가 에러를 띄운다.

?? 연산자를 통해 옵셔널의 기본값을 nil 값이 아닌 다른 값으로 할당할 수 있다.

var someOptional: String? = nil
let someOptionalWithDefaultValue: String = someOptional ?? "default value of optional"

reference
핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍 / 닐 스미스 지음 / 황반석 옮김 / 제이펍 출판

0개의 댓글