[arcjeen] 3.swift Optional
Optional
값을 반환하는 과정에서 오류가 발생할 가능성이 있는 값을 옵셔널 타입이라는 객체로 감싼 후 반환하는 개념 (Optional Wrapping)
-> 런타임시에 프로그램이 비정상적으로 종료되는 것을 방지하기 위한 장치로 생각하면됨.
Objective-c 에는 일반언어의 null에 해당되는 nil 형이 있는데 이것은 객체들에는 할당할 수 있지만 일반 자료형에는 할당 할 수가 없다. 그렇기때문에 일반자료형을 대신해 반환형으로 Optional을 쓰는 것.
초기화
var optStr : String ?
자료형 뒤에 ?만 붙여주면된다. 옵셔널 타입으로 선언된 자료형은 선언만해도 nil로 초기화가 된다.
Forced Unwrapping (Optional 강제 해제)
Optional 타입의 자료는 어떠한 연산이나 결합도 지원하지 않는다. 그렇기때문에 자료를 감싸고있는 Optional 개체를 해제해주어야 되는데 이것을 옵셔널 해제라고 한다. 옵셔널 해제 방식에는 비강제 해제와 강제해제가 있다.
강제해제는 자료형뒤에 !(Forced-Unwrapping operator) 연산자만 붙여주면 객체가 해제되고 내부에 저장된 값을 추출할 수 있다.
var optInt : int? = 3;
print ((optInt));
print((optInt!));
결과
// Optional(3)
// 3
그러나 nil값이 할당되어 있는 옵셔널 변수에 강제 해제 연산자를 붙인다면 오류가 발생한다. 그렇기 때문에 강제해제를 할때는 항상 nil인지 아닌지 확인을 해주어야한다
if optInt != nil{
print((optInt)!)
}else {
print("this is nil")
}
Optional 비강제 해제
if 구문 내에서 조건식 대신 옵셔널 타입의 값을 일반 타입의 변수나 상수에 할당하는 구문을 사용하는 방식.
var str = "Swift";
if let intFromStr = Int(Str){
print("성공 반환값은 \(intFromStr)");
}else{
print("변환 실패");
}
Dictionary의 경우 무작위로 키가 사용될 수 있기 때문에 키가 있는지 점검하기가 어렵다. 그렇기때문에 키에 해당되는 벨류는 Optional객체로 반환된다.
Optional 자동 해제
명시적으로 강제 해제를 하지 않아도 컴파일러에서 자동으로 옵셔널을 해제하여 처리하는 경우가 있다.
비교연산을 처리할때는 옵셔널 타입여부에 구애받지않고 일반 자료형처럼 값을 비교하면 된다.