Swift 문법을 공부하면서 제일 이해하기 어려운 부분인 Optional에 대해 자세히 알아보기 위해 구글링을 하고 내가 이해한 내용을 바탕으로 정리해보았다.
간단하게 말하자면 let optionalValue: Int?
처럼
변수를 선언할 때 타입의 뒤에 ?
를 붙여주면 Optional 이 된다.
?
의 뜻은 값이 있을수도있고 없을수도 있다
그럼 왜 이게 필요할까?
Swift에서는 기본적으로 변수를 선언할 때 nil 값이 들어가는 것을 허용하지 않는다.
var optionalValue: String = nil // 컴파일 에러
var optionalValue: String? = nil
var optionalValue: String? // 위 문장과 동일하게 nil 값임
여기서 잠깐 nil 에 대해 2가지만 간단히 짚고 넘어가자.
1. nil은 optional 변수 외에 사용할 수 없다.
2.nil != null
null은 pointer가 존재하지 않는 값을 가리켰지만 nil은 value가 없다는 뜻이다.
nil에 대해서 나중에 더 자세하게 다룰 예정이다.
Swift에서 String을 Int로 캐스팅 하게되면 특이하게 Optional로 결과가 나온다.
let stringNum = “123”
let convertedNum = Int(stringNum)
print(convertedNumber) // 출력 : Optional(123)
이걸 보면 123이라는 값이 Optional에 마치 Wrapping 되어있는 것 같다.
우리는 123이라는 값만 필요하기 때문에 Unwrapping 과정이 필요하다.
- Forced Unwrapping
- Optional Binding
만약 위의 예시처럼 출력 값이 무조건 있다면 (nil이 아니라는게 보장된다면)
끝에 느낌표를 붙이는 것 만으로 123을 꺼낼 수 있다.
Optional(123)
-> Optional(123)!
let value1: String? = nil
let value2: String! = nil // 에러 안남
print(value1) // nil 출력
print(value2) // unwrap된 상태에서 nil 값 출력시 런타임 에러
일단 print할 때 오류가 났다는 점에 주목해보면
value2는 !
에 의해 자동으로 unwrap된 상태가 된다. ( 출력값 : nil
)
하지만 아까 nil은 value가 없는 상태라고 했다. 즉, print 할 값 자체가 존재하지 않는다.
그렇기 때문에 런타임 에러가 발생한다. (라고 이해했다.)
짧게 말해서 예외처리 과정이 또 필요하다.
그래서 예외처리를 짧게 해주는 방법이 뭐냐? 그게바로
일단 Optional Binding 공식은 이거다.
if let 임시변수명 = Optional 변수 {
// Optional 변수에 값이 있다면 let 임시변수에 할당해라
} else {
// 그렇지 않으면 어쩌구..
}
대충 여기까지만 알아도 사용할 수 있는 간결한 문법이다.
if-let 한문장으로 optional 값이 있으면 바로 값을 꺼내서 변수에 할당할 수 있다.
이 때 주의할점은 if-let 구문안에 있는 임시변수는 구문 내에서만 쓰이는 로컬변수라는 점!
Optional Binding의 기능을 2가지로 요약하자면
1. Optional type의 변수에 대한 nil 체크
2. 로컬 변수에 값을 할당하여 바로 사용
정도로 할 수 있겠다!
https://medium.com/@codenamehong/swift-optional-1-54ae4d37ee09