728x90
반응형
옵셔널이란? (Optional)
- 값이 있을 수도 있고, 없을 수도 있다는 개념
- 즉, nil의 가능성을 문서화하지 않고도 명시적으로 코드에서 표현할 수 있음 👉 시간 절약
- 예) 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않더라도 안심하고 사용 👉 효율적이고 안전
// someOptionalParam can be nil
func someFunction(someOptionalParam: Int?) {
// ...
}
//someParam must not be nil
func someFunction(someParam: Int) {
// ...
}
someFunction(someOptionParam: nil)
someFunction(someParam: nil) // 오류발생 - 옵셔널이 아닌 타입에는 nil을 보낼 수 없기 때문
옵셔널은 열거형 방식이기 때문에 switch-case 문을 사용하여 처리해줄 수 있음
옵셔널을 선언하는데에는 아래와 같은 여러 방법이 있으나, 보통 ? 혹은 !을 사용
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
! (암시적 추출 옵셔널, Implicitly Unwrapped Optional)
var optionalValue: Int! = 100
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
// 기존 변수처럼 사용 가능
optionalValue = optionalValue + 1
// nil 할당 가능
optionalValue = nil
// 잘못된 접근으로 런타임 에러 - nil에 1을 더하려고 했기 떄문
optionalValue = optionalValue + 1
? (Optional) : 옵셔널
var optionalValue: Int? = 100
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some:
print("Value is \(value)")
}
// nil 할당 가능
optionalValue = nil
// 기존 변수처럼 사용 불가 - 옵셔널과 일반 값을 다른 타입으로 연산 불가
optionalValue = optionalValue + 1
옵셔널 사용하는 방법
1. 옵셔널 바인딩 (Optional Binding)
- 옵셔널의 값을 꺼내오는 방법 중 하나
- 안에 값이 있는지 없는지 체크 후 있다면 꺼내옴!
- nil 체크 + 안전한 값 추출
- if-let 방식을 사용 👉 런타임 오류가 발생하여 프로그램이 정지할 일이 없음
var myName: String? = "yagom"
var yourName: String? = nil
// 반드시 if-let을 사용하여 옵셔널 바인딩 수행 가능
if let name = myName, let friend = yourName {
print("\(name) and \(friend)"
}
// yourName이 nil이기 때문에 실행되지 않음
yourName = "haha")
if let name = myName, let friend = yourName {
print("\(name) and \(friend)"
}
// yagom and haha
2. 강제 추출 (Force Unwrapping)
- 옵셔널의 값을 꺼내오는 또 다른 방식
- 옵셔널에 값이 들어있는지 판단하지 않고, 강제로 보호막을 깨부셔서 꺼내오는 방법
func printName(_ name: String) {
print(name)
}
var myName: String? = "yagom"
printName(myName!) // yagom
myName = nil
print(myName!) // 강제추출시 값이 없으므로 런타임 오류 발생
var yourName: String! = nil
printName(yourName) // 위에서 변수 선언시 !을 붙여주었기 때문에 값 추출때도 ! 안써도 됨
// nil 값이 전달되기때문에 런타임 오류발생
본 내용은 부스트코스의 'iOS 프로그래밍을 위한 스위프트 기초' 강의를 토대로 작성되었습니다
728x90
반응형