옵셔널
값이 있고 옵셔널로 래핑 해놓은 값을 언래핑하여 해당 값에 엑세스 할 수 있다
값이 전혀 없다
-옵셔널 타입끼리의 연산은 불가능
// 축약 타입 표현
var serverResponseCode: Int? = 404
// 정식 타입 표현
var myPetName: Optional<String> = "멍멍이"
func pay(with card: String?) {
// 구현 코드
}
-----------------------------------------------------------
// 옵셔널 타입끼리의 연산은 불가능
var num1: Int? = 4
var num2: Int? = 2
num1 + num2 // 에러 발생!
let optionalString1 : String? = "Hello, "
let optionalString2 : String? = "world!"
// 옵셔널 String 값들을 연결하려는 시도
let result = optionalString1 + optionString2 // 에러 발생!
var serverResponseCode: Int? = 404
serverResponseCode = nil
var surveyAnswer: String?
// surveyAnswer 는 자동으로 nil 로 설정됨
if let <#상수 이름#> = <#옵셔널 값#> {
// 구현코드
}
-----------------------------------------------------------
let roommateNumbers: Int? = nil
if let roommates = roomateNumbers {
print(roommates)
}
// 출력값 없음
-----------------------------------------------------------
let ticketCounts: Int? = 3
if let ticket = ticketCounts {
print(ticket)
}
// 출력값 : 3
-----------------------------------------------------------
// 옵셔널 바인딩 할 변수가 여러 개인 경우
let boyName : String?
let girlName : String?
boyName = "하늘"
girlName = "나연"
// , 콤마로 나열
if let boy = boyName,
let girl = gitlName {
print(boy, girl)
}
// 출력값 : 하늘 나연
-----------------------------------------------------------
let x : Int? = 10
let y : Int? = nil
func opbinding() {
guard let x = x else {return}
print(x)
guard let y = y else {return} // y 는 nil 이므로 여기서 return
print(y) // 위에서 return 했기 때문에 실행 안됨
}
opbinding()
//출력값 : 10
let number = Int("42")!
// String 값을 Int로 변환하는 함수는 return 값으로 옵셔널 값을 반환.
print(number)
// 출력값 : 42
-----------------------------------------------------------
// 강제 언래핑이 실패한 경우
let address : String? = nil
print(address!)
// 에러 : Unexpectedly found nil while unwrapping an Optional value
var optNumber: Int? = 3
let number = optNumber ?? 5
print(number)
//출력값 : 3
//number 는 Int? 타입이 아니라 Int 타입
optNumber = nil
let number2 = optNumber ?? 5
print(number2)
//출력값 : 5
//number2 는 Int? 타입이 아니라 Int 타입
struct Person {
var name : String
var address : Address
}
struct Address {
var city: String
var street: String
var detail: String
}
let sam : Person? = Person(name: "Sam", address: Address(city: "서울", street: "신논현로", detail: "100"))
print(sam.address.city) // 에러 : Chain the optional using '?' to access member 'address' only for non-'nil' base values
sam?.address.city //Ok
//출력값 : 서울