안녕하세요:)
오늘은 "값이 없음"을 표현하는 방법에 대해서 알아보도록 하겠습니다.
name: Type? // 타입 뒤에 물음표(?)를 붙여주면 옵셔널 타입이 됩니다.
var optionalNum: Int? // nil, 옵셔널 Int라고 읽습니다.
var str: String = "iOS" // Non-optional Type은 항상 값을 가져야 합니다.
왜 Optional을 사용할까요?
그 이유는 crash 없이 처리하기 위해서 사용합니다.
그렇다면 이 옵셔널 값을 어떻게 사용해야 할까요?
옵셔널 Int와 일반 Int, 옵셔널 String과 일반 String 등 결합이 불가합니다. 이 값을 사용하려면 옵셔널 언래핑이 필요합니다.
var num: Int? = 10
print("옵셔널 자체의 값 : \(num)") // 옵셔널 자체의 값 : Optional(10)
print("강제 추출한 값 : \(num!)") // 강제 추출한 값 : 10
var nilNum: Int?
print("옵셔널 값 : \(nilNum)") // nil
print(nilNum!) // 에러!
이와 같이 값이 없을 때 강제 추출하면 에러가 일어납니다.
그렇기 때문에 강제 추출할 때는 꼭 값이 있는지 없는지 확인하고 추출해야 합니다.
var str = "123"
var inStr = Int(str)
if inStr != nil {
print("\(inStr!)")
} else {
print("값 변환 실패")
} // 123
이렇게 때문에 Forced Unwrapping은 사용하지 않는 것이 좋습니다.
그렇다면 어떤 방식으로 언래핑을 해야 할까요?
Optional Binding을 사용하면 안전하게 언래핑을 할 수 있습니다.
if let name: Type = OptionalExpression { // let name: Type = OptionalExpression 이 부분을 바인딩이라고 부릅니다.
statement
}
while let name: Type = OptionalExpression {
statement
}
guard let name: Type = OptionalExpression else {
statement
}
var str: String? = "Hello"
guard let str = str else { // 여기서 바인딩된 상수는 else블록 다음에서 사용할 수 있습니다.
fatalError()
} // 값을 리턴하는 경우에만 Unwrapping하기 때문에 강제추출과 같은 에러는 발생하지 않습니다.
str // Hello
var num: Int? = nil
if let num = num {
print(num)
} else {
print("fail")
} // fail
var str: String! = "Swift"
str
var num: Int! = 12
num
var str: String! = nil
var result = "확인결과" + (str ?? "nil")
print(result) // 확인결과 nil