코딩하는 제리

[Swift] swift 옵셔널 본문

iOS/SwiftUI

[Swift] swift 옵셔널

JerryCho 2022. 1. 7. 14:59

// 값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환.
// Int("100")은 100이 아닌 Optional(100)을 리턴함.
// Int("Hi")는 정수 값을 반환할 수 없음. 아무런 값도 반환할 수 없다(nil 반환).
// nil 값을 저장하려면 Optional 타입으로 선언해야함.
// 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위함.(null-safety와 비슷?)
// 옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 "?" 문자를 씀.
// 정수값을 갖거나 nil을 가질 수 있음.
var index: Int?

// nil 값을 옵셔널이 아닌 변수나 상수에 할당할 수 없음
var myInt = nil // error
var myInt = Int? = nil // OK
var myInt = Int? // OK, 위와 같음 (nil로 초기화됨)


// 강제 언래핑
// 옵셔널 변수 타입에 값이 있으면 옵셔널로 래핑되었다고 함
// 옵셔널에 래핑된 값은 강제 언래핑으로 풀어줌
// 선언시 타입 뒤에 "?", 사용시 변수명 뒤에 "!"
var x : Int?
x = 10
print(x) // Optional(10)
print(x!) // 10

// nil이 아닌지 확인하고 풀어야함.
// 아니면 crash 발생.
if x != nil {
	print(x!)
} else {
	print("nil")
}


// 옵셔널 바인딩
// 강제 언래핑보다 좋은 방법
// 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당
if let constantname = optionalName {
	// 옵셔널 변수가 값이 있다면 언래핑해서 일반 상수 constantname에 대입하고 if문을 실행.
    // 값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음.
    print(constantname)
}

if var variablename = optionalName {
	// 옵셔널 변수가 값이 있다면 언래핑해서 일반 변수 variablename에 대입하고 if문을 실행.
    // 값이 없다면 if문의 조건이 거짓이 되어 if문을 실행하지 않음.
    print(variablename)
}


// 여러 옵셔널 언래핑
var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 {
	print(firstPet, secondPet)
} else {
	print("nil")
}

 

옵셔널은 연관 값(associated value)을 갖는 enum 이다.

 - 옵셔널 자체가 enum으로 구성되어있다.

 - 옵셔널은 기본적으로 none과 some을 enum의 case로 가지고 있다.

// 옵셔널은 enum 형식으로 작성되어있다.
var x: Int? = 20	// .some(20)과 동일
var y: Int? = Optional.some(10)	// 10과 동일
var z: Int? = Optional.none		// nil과 동일
var x1: Optional<Int> = 30	// Int? = 30과 동일
print(x, y, z, x1) // Optional(20), Optional(10), nil, Optional(30)


// age를 옵셔널로 지정하면 switch-case문을 사용할 수 있다.
let age: Int? = 30
switch age {
	case .none:	// nil인 경우
		print("나이 정보 없음")
	case .some(let a) where a < 20:
		print("미성년자")
	case .some(let a) where a < 71:
		print("성인")
	default:
		print("경로우대")
}

 

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

[Swift] 타입 검사, 범위 연산자, nil 합병 연산자  (0) 2022.01.12
[Swift] swift 형변환  (0) 2022.01.11
[Swift] swift 튜플  (0) 2022.01.07
[Swift] swift 클로저 캡쳐  (0) 2022.01.07
[Swift] swift 클로저 - @autoclosure, @escaping  (0) 2022.01.04
Comments