Optional-옵셔널 타입,옵셔널 바인딩, 강제해제(forced unwrapping), error handling
19 Oct 2017 | iOS swift옵셔널의 개념
-
값을 박싱하는 개념 : 반환하고자 하는 값을 옵셔널 객체로 다시 한 번 감싸는 개념
- 어떤 한 데이터가 있는데 그게 값이 있느냐 없느냐를 구분하기위해서 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
를 사용한다.
do
로 블럭을 감싸고try
를 앞에 붙여 함수 호출 - 제대로 그 함수(throw가 붙어있는 호출한 함수)가 실행되면try로 감싼 다음 함수
로 가고- catch - 에러가 발생하면 (throw가 붙어있는 함수가 실행되다가 예외가 발생했을경우)catch 블럭이 실행된다.
Comments