Ch.6 옵셔널
- 일반자료형에는 nil값을 할당할수 없음
- 옵셔널 타입으로 선언된 자료형은 nil값을 저장할수 있음
- nil값을 저장해야 하거나 혹은 함수나 메소드의 결과값에 nil이 포함될 가능성이 있다면(오류가 발생할 가능성이 있다면) 반환타입을 옵셔널 타입으로 설정해야함
- 모든 일반 자료형들을 기반으로하여 각각의 자료형에 대한 옵셔널 타입이 만들어짐(클래스나 구조체포함)
- 옵셔널 타입이 실제로 가질수 있는 값은 nil이 아닌값, nil 두가지
- 처리에 실패시 nil값을 반환하고 성공시 옵셔널 객체로 둘러싸인 결과값을 반환
- 결국 옵셔널 타입이란 반환하고자 하는 값을 옵셔널 객체로 다시한번 감싼 형태를 의미
6-1 옵셔널 타입 선언과 정의
- 일반자료형을 옵셔널 타입으로 정의하는 방법
- 자료형 뒤에 ? 붙이면 됨
- Int?, String?
- var optInt: Int?, var optString: String?
- 옵셔널 타입으로 선언된 자료형을 초기화 하지 않을 경우 자동으로 nil로 초기화됨(옵셔널 타입자체에 nil이 부여된다는 뜻)
var optInt : Int?
optInt = 3
print(optInt)
var optStr: String?
optStr = "Swifr"
print(optStr)
var optArr : [String]?
optArr = ["c", "java", "objective-c","smalltalk"]
print(optArr)
var optInt : Int?
optInt = 3
print(optInt)
var optStr: String?
optStr = "Swifr"
print(optStr)
var optArr : [String]?
optArr = ["c", "java", "objective-c","smalltalk"]
print(optArr)
6-2 옵셔널 값 처리
- 결과값으로 전달받은 것은 Optional이라는 객체, 그내부에 원하는 값이 들어있음.
- 이 값을 사용하려면 실제값을 둘러싼 옵셔널객체를 해제해야함
6-2-1 명시적해제(강제해제)-Forced Unwrapping
- 옵셔널 값의 nil여부와 관계없이 옵셔널을 무조건 해제하는 방식
- 옵셔널 타입의 변수나 상수 뒤에 !만 붙이면 됨
- ! 연산자만 붙이면 옵셔널 객체가 해제되고 내부에 저장된 값을 추출할 수 있음
var optInt : Int? = 3
print("옵셔널 자체의 값 \(optInt)")
print("옵셔널 강제 해제의 값 \(optInt!)")
옵셔널 자체의 값 Optional(3)
옵셔널 강제해제의 값 3
- 강제해제 연산자를 사용할 때에는 먼저 옵셔널 값이 nil인지 점검해야함
- 그리고 옵셔널 값이 nil이 아닐때만 강제해제 연산자를 붙여서 값을 추출해야 함
- ! 연산자는 확실히 옵셔널의 값이 nil이 아닌 조건에서만 사용해야함
var optInt : Int? = 3
print("옵셔널 자체의 값 \(optInt)")
print("옵셔널 강제 해제의 값 \(optInt!)")
옵셔널 자체의 값 Optional(3)
옵셔널 강제해제의 값 3
6-2-2 옵셔널 바인딩
- 조건문 내에서 일반 상수에 옵셔널 값을 대입하는 방식으로 이루어짐
- 반드시 조건문에서 사용해야만 하며, 상수에 옵셔널 값을 대입한 결과는 true/false로 리턴됨
var str = "Swift"
if let intFromStr = Int(str){
print("반환된 값은\(intFromStr)입니다")
}else {
print("값 반환에 실패")
}
- 강제해제 연산자를 사용하지 않아도 옵셔널 타입의 값이 일반타입의 변수나 상수에 할당되는 과정을 거치면서 자연스럽게 옵셔널 타입이 해제되지만, 옵셔널 타입의 값이 nil일 때에는 값의 할당이 실패하여 결과값이 false로 반환될 뿐이므로 else블록이 실행되는것 이외에 오류는 발생하지 않음.
- 딕셔너리가 옵셔널 타입의 값을 반환하는 이유는 딕셔너리에서 값을 읽을 때에는 존재하지 않는 키를 사용할 가능성이 있기때문
- 이경우 딕셔너리는 주어진 키에 값이 비어있거나 입력된 키가 아예 없다는 것을 표현하기 위해 nil을 반환해야 함
- 이 때문에 딕셔너리는 기본적으로 옵셔널 타입으로 정의된 값을 반환하게 됨
- 옵셔널 타입에서 ! 연산자를 사용할 때에는 반드시 nil 점검을 해주어야 오류를 미연에 방지할 수 있음.
var str = "Swift"
if let intFromStr = Int(str){
print("반환된 값은\(intFromStr)입니다")
}else {
print("값 반환에 실패")
}