값이 없는 경우 옵셔널을 사용한다. 옵셔널은 타입 중 하나로 인식하는 것이 이해하기 쉽다. 옵셔널에게는 크게 두 가지 기능이 있다.
1. 값이 있고 옵셔널을 풀어서 값에 접근하는 것.
2. 값이 없는 것.
1. 옵셔널을 통해서 값이 없는 상황에 대처한다.
let number = "123"
let convertedNumber = Int(number)
//위의 경우 초기화가 실패할 가능성이 있기 때문에 옵셔널 Int를 반환하게 된다.
//왜냐하면 만약 number값이 "abc"인 경우에는 값이 아예 변환되지 않기 때문이다.
//따라서 위에서 convertedNumber는 옵셔널 Int값을 갖는다. = optional(Int)
2. nil을 통해 옵셔널 변수에 값이 없는 상태를 나타낼 수 있다.
var serverResponse : Int? = 404 // 실제 Int값을 가진다
serverResponse = nil
//다음과 같이 선언해주면 값이 없게 된다. 비어있다, 라고 생각하는 것이 좋다.
3. 옵셔널이 아닌 상수와 변수에는 nil을 사용할 수 없다. 만약 해당 상수나 변수가 없는 상태에서도 동작이 요망되는 경우엔 옵셔널 타입으로 선언해야 한다.
var number : Int?
var string : String?
//다음과 같이 옵셔널 타입으로 선언하게 되면 값이 없는 상태를 정의할 수 있게 된다.
4. 기본값이 없는 상태로 옵셔널 변수를 정의하면 이 변수는 자동적으로 nil의 값을 가지게 된 상태로 초기화된다.
let a : Int?
//이 경우는 결국 let a : Int? = nil와 같은 형이다.
5. if 문에서 옵셔널과 nil을 비교하여 값의 포함여부를 체크할 수 있다.
if a != nil {
print(a)
}
//다음과 같이 해주게 되면, 만약 a의 값이 비어있지 않은 경우 a를 출력해라. 라는 명령을 수행할 수 있다.
옵셔널 바인딩은 옵셔널이 값을 포함하고 있는지 확인하고 값이 있는 경우 해당 값을 임시 상수 또는 변수로 사용할 수 있게 해준다.
1. if let 을 활용하여 옵셔널 바인딩을 활용할 수 있다.
if let a = optionalValue {
print(a)
}
//만약 optionalValue가 옵셔널 값인 경우, 이를 임시 상수 a에 대입하고 활용할 수 있다.
//만약 optionalValue가 nil인 경우 해당 구문은 실행되지 않는다.
//if구문에서 옵셔널 바인딩을 통해 생성된 상수 및 변수는 오직 구문안에서만 사용 가능하다.
//추후 다룰 guard로 생성된 상수 및 변수는 다음 코드라인에서부터 사용가능하다.
2. guard let 을 활용하여 옵셔널 바인딩을 활용할 수 있다.
guard let a = optionalValue else {return}
//다음과 같이 guard를 통해 상수를 선언하면, 옵셔널 값이 있는 경우 임시 상수 a에 담겨 사용이 가능해진다.
//만약 값이 nil인 경우엔 else값이 반환되고 return 되어 결과적으로 값이 없게 된다.
3. 때로는 프로그램 구조 상 옵셔널이 값을 처음 설정한 후 항상 값을 가지는 경우가 있다. 이럴 경우에는 항상 값이 있다고 가정할 수 있으므로 접근할 때마다 값을 확인하고 언래핑 할 이유가 없다. 이는 '암시적으로 언래핑된 옵셔널'로 정의할 수 있다.타입 선언시 옵셔널의 경우 ? 를 사용하지만 이는 ! 를 사용하여 정의한다. 이는 첨은 정의된 직후 옵셔널 값이 존재하는 게 확인되고 그 이후 모든 시점에서도 값이 존재할 경우 사용한다.
let possibleString : String? = "An optional string"
let forcedString : String = possibleString! // 강제 언래핑 시도, 값이 있으므로 런타임 에러 없음.
let newString : String! = "impliticitly unwrapped optional string"
//암시적으로 언래핑된 옵셔널로 정의
let implenewString : String = newString // 해당 값을 바로 대입 가능함.
4. 옵셔널 강제 언래핑은 옵셔널 값의 맨 뒤에 !를 붙여서 시도한다. 이는 옵셔널 값이 nil이 아닌 경우에 한해서 강제적으로 시도할 수 있다. 만약 해당 값이 nil을 가질 경우에는 런타임 에러가 나게 된다.
let a : Int? = 3
print(a!)
//위에서는 옵셔널 값이지만 nil이 아니므로 강제 언래핑을 시도해도 오류가 나지 않는다.
옵셔널은 값이 없을 수 있는 경우를 컨트롤 하기 위할때나, 값이 없음을 나타내야 할 경우에 모두 대응하기 위해 사용하는 일종의 타입이다. 옵셔널을 사용하는 특성은 스위프트가 가진 대표적 특성 중 하나이며, 이는 프로그램의 안정성을 높이기 위한 것이다.