-
[TIL] OptionalToday I Learned 2023. 9. 26. 22:02
Optional이란?
:swift 는 안전한 코딩을 할 수 있게 해주는 언어. 안전성의 바탕이 되는 요소 중 하나가 바로 Optional이라는 개념이다.
Optional은 type casting이나 nil value 체크 등에 있어서 중요한 역할을 한다.
- Optional은 “?”을 통해 표현된다.
- 의미: 이 변수에는 값이 들어갈 수도 있고, 아닐 수도 있다.(nil)
- 즉, nil(타입)을 표현하기 위한 수단으로 ?를 사용한다는 것.
let myFirstOptionalVar: Int?
위처럼 변수 타입 뒤에 ?를 붙여주면 해당 변수는 Optional이 된다.
- swift에선 기본적으로 변수 선언 시 nil 값이 들어가는 것을 허용하지 않는다. (컴파일 에러)
그러므로, 아래 코드에서 첫 째줄은 에러이고, 두번째 줄은 에러가 아니다.
# Nil을 대입하는 경우 var optionalString: String = nil var optionalString: String? = nil # Optional type(String?)
- 다음 예시는 String -> Int로 캐스팅하는 경우
let possibleNumber = “123” let convertedNumber = Int(possibleNumber) //Int초기화에 실패. Optional Int형으로 선언 print(convertedNumber) // 출력 결과 : Optional(123)
Nil
: swift에선 nil은 optional변수 외에는 사용할 수 없다.
하지만 iOS 개발에서 nil은 사용을 많이 하므로 optional에 대해 알아둬야한다.
var optionalString: String? var optionalString2: String? = nil // 두 값 모두 nil
- 다른 언어에서의 pointer가 존재하지 않는 값을 가리키는 것과는 다르다. nil은 단지 value값이 없는 것을 나타낸다. 주소값 비교와 value값 비교정도로 이해하자.
Wrapping
: optional타입은 기본적으로 wrap이 되어있는 상태이다.
즉, optional로 선언된 변수들은 값이 있는 건지, nil인건지 wrap되어 있어서 모르는 상태이다.
value값이 있어도 바로 출력되지 않는다. (Swift 3.0 반영 예시)아래와 같이
var optionalString: String? = “Hello” print(optionalString) // 출력 결과: Optional(“Hello”)
optionalString이 nil일 수도 있기 때문에, 결과값 “Hello”가 출력되지 않고 Optional(“Hello”)가 된다.
Forced Unwrapping
앞선 예제에서처럼 출력 결과가 Optional(“Hello”)처럼 나오는 것은 대부분의 경우 원하는 출력값이 아닙니다. 이 때 올바른 출력을 위해 사용하는 것이 !(exclamation mark), 즉 느낌표입니다. 즉, optional로 선언했지만, 무조건 변수가 있는 상황이 보장된 경우 느낌표(!)를 쓰면 우리가 원하는 Hello을 출력할 수 있습니다.
var optionalString: String? = “Hello” print(optionalString!) // 출력 결과: Hello
변수명 뒤에 느낌표는 Optinoal을 unwrap하는 것.
//simulator 에러 let value1: String? = nil //String -> Any로 권유하는 에러 let value2: String! = nil print(value) // nil 출력 print(value2) // nil 출력 // nil에 !로 인한 강제 unwrap & Any로의 형 변환 둘다 권유
다만 이 경우 value에 nil이 담겨 있는 상태이므로, value2의 경우처럼 느낌표에 의해 자동으로 unwrap시키면, 값이 없는 상태였기 때문에 error가 발생한다.
따라서 일반적으로 위처럼 value2가 unwrap된 상태일땐, if를 통해 nil인지 확인하고 출력한다.
nil은 wrap상태로 출력하면 nil을 출력한다.
Optional binding
:Optional Binding은 조금 독특한 if let 형태의 조건문이다.
// Optional type으로 선언한 myNumber let myNumber: Int? = 1234 if let actualNumber = myNumber { print(“\(myNumber)은 실제로 \(actualNumber)입니다.”) } else { print(“\(myNumber)는 변환될 수 없습니다.”) } // 출력 결과 : Optional(1234)은 실제로 1234입니다. print(actualNumber) // error
위의 예에서는 myNumber가 Optional 타입으로 선언되어 있습니다. 원래는 이 myNumber값을 출력하기 위해서는 !를 사용해야합니다. 하지만, Optional Binding은 먼저 이 myNumber의 값이 있는 경우와 없는 경우로 나누고, 값이 있는 경우를 if let 조건문 안에 넣을 수 있습니다. 여기서는 actualNumber에 myNumber의 값을 할당하고, 값이 있다면 actualNumber에 이를 넘겨주어 바로 실제 값으로 사용할 수 있도록 해줍니다. 추가적으로 actualNumber는 if문 안에서만 할당되는 로컬 변수입니다. if 밖에서는 actualNumber를 사용할 수 없습니다.
=> Optional Binding은 Optional type의 변수에 대한 nil 체크와 로컬변수에 이 값을 할당하는 두 가지 기능을 가지고 있습니다.
[출처] - https://medium.com/@codenamehong/swift-optional-1-54ae4d37ee09
'Today I Learned' 카테고리의 다른 글
[네이버 부스트캠프 9기 챌린지] 최종 회고 (2) 2024.08.12 [네이버 부스트캠프 챌린지] 3주차 회고 (0) 2024.08.12 [네이버 부스트캠프 챌린지] 2주차 회고 (0) 2024.07.29 [네이버 부스트캠프 챌린지] 1주차 회고 (0) 2024.07.29 [TIL] git rebase (0) 2023.09.24