공부 연습장 :-)

Optional-옵셔널 타입,옵셔널 바인딩, 강제해제(forced unwrapping), error handling

|

옵셔널의 개념

  • 값을 박싱하는 개념 : 반환하고자 하는 값을 옵셔널 객체로 다시 한 번 감싸는 개념

  • 어떤 한 데이터가 있는데 그게 값이 있느냐 없느냐를 구분하기위해서 boxing함
  • 변수에 항상 값이 있다고 생각하면 로직이 불안정해질 위험이 있으니까 > 스위프트는 변수에 옵셔널타입이라는 것을(옵셔널이라는 객체) 추가했다!

  • 옵셔널 변수는 정상적인 변환이 불가능한 상황이라면 nil값을 반환하고 프로그램이 종료된다.

  • nil은 아예 리턴도 안하고 프로그램이 멈춰버림. 그래서 코드에 !가 있으면 중요하고 위험한 포인트라고 감지해야함

  • 일반 자료형에 nil은 억지로 대입할 수도 없음

옵셔널 타입 선언

형태 : 변수타입?

// ex)String? / Int?
var optInt : Int?
var optStr : String?

// 옵셔널 타입의 변수나 상수에는 값도 할당 가능
var optInt : Int?
optInt = 3

var optDic : [String : Int]?
optDic = ["국어" : 94, "수학" : 88, "영어" : 96]

옵셔널 강제 해제 방법

  • ! : forced unwrapping. 변수명 앞에 느낌표를 붙여 강제로 해제한다.
  • 하지만 값이 nil이 아닌지 판단해서 값을 풀어주는게 훨씬 좋은방법임.
// ex) 안정적으로 조건문 안에서 푸는 방법이 있음

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber) // Int?타입

if convertedNumber != nil {
  print("convertedNumber has an integer value of \ (convertedNumber!).")
}

Optional binding

  • 옵셔널 바인딩은 옵셔널의 값이 존재하는지를 검사한 뒤, 존재한다면 그 값을 다른 변수에 대입시켜준다.
//if let actual number = nil이 아니면 박스를 풀어서 값만 변수에 넣어주고(actualNumber), nil인 경우 else문에서 nil을 리턴하고 프로그램이 끝나버림. (예외처리를 해야함)

if let actualNumber = Int(possibleNumber) {
  print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
 print("\"\(possibleNumber)\" could not be converted to an integer")

Nil-coalescing

  • 옵셔널 값을 풀어주는 개념으로 삼항연산자를 활용해서 쓸 수 있음

(연산자? : 값을 확인, 변경, 결합하는데 사용하는 특별한 기호나 문구)

삼항 연산자

변수 = (bool 조건) ? 참일때 값 : 거짓일때 값

ex)

doBlindDateFlag = (point>=80) ? true : false

  • z = (a != nil) ? a! : b
    • a가 nil이 아니면 z에 넣어주고, 그 반대의 경우엔 b를 넣어라

Error Handling

  • 예를들어 readline()같은 함수는 리턴타입이 옵셔널이다. 사용자가 값을 입력하지 않을 수도 있기때문이다.

  • 근데 아예 리턴타입없이 throw가 붙어있는 함수 : 함수를 처리하다가 다 끝나기 전에 중간에 빠져서 함수호출부로 불러 올 수도 있다는 표시

  • 이런 throw가 있는 함수를 호출할때는 do - try - catch를 사용한다.

  1. do로 블럭을 감싸고
  2. try를 앞에 붙여 함수 호출 - 제대로 그 함수(throw가 붙어있는 호출한 함수)가 실행되면 try로 감싼 다음 함수로 가고
  3. catch - 에러가 발생하면 (throw가 붙어있는 함수가 실행되다가 예외가 발생했을경우)catch 블럭이 실행된다.

Comments