앱도 만들어보고 코딩테스트 공부도 해봤지만 사실 Swift 자체를 공부한 적이 거의 없었다.
야곰 커리어 스타터캠프를 기다리며 개념강의를 들어봤고 제대로 익히기 위해 개념정리를 쓰기로 한다!
하지만 그냥 그렇구나.. 하면서 코딩했을 때 어떻게 돌아갔는지, Xcode가 고치라면 고치는 대로 제대로 이해하지 못하고 써왔다...
- 값이 존재한다
- 값이 존재하지 않는다
즉 옵셔널일 경우 값이 존재
하거나, nil
인 것이다.
nil : 값이 없는 상태
-> 옵셔널이 아닐 경우nil
을 넣을 수 없음
옵셔널에 만약 값이 존재한다면 그냥 사용할 수는 없고 옵셔널 추출을 통해 값을 사용할 수 있다.
nil
의 가능성을 표현 - 효율적- 옵셔널이 아니라면
nil
일 걱정할 필요 없음 - 안전성
var optionalValue: Optional<Int> = nil
var optionalValue: Int? = nil
옵셔널 변수를 선언할 때는 Optional<타입>
을 이용하거나 또는 간단하게 타입 뒤에 ?
를 붙이면 된다.
var optionalValue: Int! = 100
암시적 추출 옵셔널은 타입 뒤에 !
를 붙여서 선언한다.
implicitOptionalValue += 1
implicitOptionalValue = nil
//implicitOptionalValue += 1 // 런타임 에러
당연히 옵셔널이니 nil
일 수도 있고, 다른 변수나 상수처럼 사용이 가능하다.
하지만 잘못된 접근 시 런타임 에러가 발생할 수 있다.
optionalValue = nil
//optionalValue += 1 // 일반 변수처럼 사용 불가능
반대로 ?
를 이용한 기본 옵셔널 타입은 기존의 변수처럼 사용이 불가능하다.
옵셔널 변수에 값이 있을 때 그 값을 사용하기 위해서는 옵셔널 추출을 해야한다.
옵셔널 바인딩을 통해 옵셔널 타입이 nil
인지 확인하고 안전하게 값을 추출한다.
if-let
- 상수는 구문 내에서만 사용가능
컴마(,)
를 이용해 여러 옵셔널 타입을 바인딩 할 수 있음 ( 하나라도nil
일 경우 구문에 들어가지 않음)
옵셔널 타입인 변수 뒤에 !
를 붙여 값을 강제로 추출하는 방법도 있다.
var myName: String? = "hana"
printName(myName!)
myName = nil
print(myName!) // 강제추출시 값이 없으므로 런타임 오류 발생
하지만 만약 nil일 경우 런타임 에러가 발생하기에 반드시 값이 있다고 확신하는 경우에만 사용해야 한다.
암시적 추출 옵셔널은 처음부터 강제 추출을 가정한 것과 같아 !
없이 추출할 수 있다.
사용자정의 타입을 정의하다보면 프로퍼티가 다른 프로퍼티와 연결될 수 있다.
만약 그 프로퍼티가 옵셔널 타입이라면 값을 사용하기 위해선 연결된 모든 프로퍼티를 추출해야 하는데 if let
구문을 이용하면 지나치게 반복적이고 효율성이 떨어진다.
옵셔널 체이닝은 nil일지 모르는 프로퍼티들을 묶어서 추출하는 방법이다.
class First{
var first: Second?
}
class Second{
var number = 10
}
let jane: First? = First()
if let result = jane?.first?.second {
print("result is second value")
}else{
print("result is nil")
}
프로퍼티들을 .(아래첨자)
로 연결해서 순서대로 nil
인지 확인하고 넘어가게 된다.
만약 연결된 프로퍼티 중 하나라도 nil
이 있다면 nil
을 반환하고 모두 값이 있다면 값을 반환한다.
값으로 반환했더라도 불러온 결과 값은 옵셔널 타입
이 된다.
nil 병합 연산자는 값이 nil일 가능성이 있을 때 대안을 제시하는 것으로
" 만약 nil이면 이 값으로 해줘!! " 하는 것이다.
var value: String
value = jane?.first?.second ?? "없음"
위에 예시에서 ??
키워드를 이용하여 nil
이 아니면 해당 값이 할당되고 nil
이면 자동으로 " 없음 "을 가지게 된다.
[참고자료]