231129 TIL_ 옵셔널

ykyo·2023년 11월 29일
0

옵셔널

  • 옵셔널
    -값이 없을 수 있는 상황에서 사용됨
    -옵셔널은 물음표로 나타냄
    -두 가지 가능성을 나타냄
  1. 값이 있고 옵셔널로 래핑 해놓은 값을 언래핑하여 해당 값에 엑세스 할 수 있다

  2. 값이 전혀 없다

    -옵셔널 타입끼리의 연산은 불가능

// 축약 타입 표현
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 // 에러 발생!
  • nil
    -변수에 nil을 할당함으로서 값이 없는 상태의 옵셔널 프로퍼티를 만들수 있음
var serverResponseCode: Int? = 404
serverResponseCode = nil

var surveyAnswer: String?
// surveyAnswer 는 자동으로 nil 로 설정됨
  • 옵셔널 바인딩
    -옵셔널 바인딩은 옵셔널 값이 빈값인지 존재하는지 검사한 후, 존재하는 경우 그 값을 다른 변수에 대입시켜 바인딩 하는것
    -빈 값을 체크하고 옵셔널 값을 언래핑 해주는 것은 강제로 언래핑하는 것보다 훨씬 안전함
    -(if let / if var), (guard let / guard var) 을 써서 옵셔널 값을 추출해 새로운 변수에 바인딩
    -if let vs guard let 차이점
    -if let 은 if문의 코드 구현부 내에서만 상수 사용이 가능 (지역 변수)
    -guard let 은 quard 문을 통과한 상수를 guard문 밖에서 사용 가능 (전역 변수)
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
  • 옵셔널 강제 언래핑
    -강제 언래핑은 ! 를 써서 강제로 옵셔널 추출
    -잘못 사용할 경우 프로그램이 비정상적으로 종료될 수도 있음 (nil 일 경우)
    -최대한 사용하지 않는게 좋음
let number = Int("42")!
// String 값을 Int로 변환하는 함수는 return 값으로 옵셔널 값을 반환.
print(number)
// 출력값 : 42

-----------------------------------------------------------
// 강제 언래핑이 실패한 경우
let address : String? = nil
print(address!)
// 에러 : Unexpectedly found nil while unwrapping an Optional value
  • 옵셔널 변수의 값이 nil일 때를 위해 기본값 설정하기
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
//출력값 : 서울
profile
for ios, swift, etc.

0개의 댓글