You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varnum2:Optional<Int>print(num2) // 에러 : 실제 메모리에 아무값도 저장되어 있지 않다.
옵셔널 (Optional) 타입 추출
Unwrapping (언래핑)
강제 추출
num!
nil 이 아닌지 확인 후, 강제 추출
if num! !=nil{print(num!)}
옵셔널 바인딩
if let
iflet name = optionalName {print(name)}
guard let
guardlet name = optionalName else{return}print(name)
Nil-Coalescing (닐 코얼레싱)
옵셔널 표현식이 nil 이라면 기본값을 제시한다.
optionalName ??"홍길동"
옵셔널 체이닝 (Optional Chaining)
표현식 자체가 옵셔널의 가능성이 있다는 것을 표현한다.
체이닝의 결과는 항상 옵셔널이다.
→ 옵셔널 체이닝의 과정에서 값 중 하나라도 nil 을 리턴한다면, 바로 nil 을 리턴한다.
human?.choco?.name
classDog{varname:String?varweight:Int?func sit(){print("앉았습니다.")}}varchoco:Dog?=Dog() // 옵셔널 Dog 타입으로 선언
choco?.name ="초코" // 옵셔널 타입에 접근 시 ? 을 붙여야 한다.
print(choco?.name) // Optional("초코")
choco?.sit()
함수 관련 표기법
choco?.sit?()?.name
sit? → 함수가 없을 수 있다.
sit?()? → 함수의 결과값이 없을 수 있다
딕셔너리 관련 표기법
books?[”Apple”]?.name
books? → 딕셔너리가 없을 수 있다.
books?[”Apple”]? → 딕셔너리의 결과값이 없을 수 있다.
함수와 옵셔널 타입
옵셔널 타입 파라미터의 사용
func doSomePrint(with label:String, name:String?=nil){print("\(label):\(name)")}doSomePrint(with:"레이블", name:"스티브잡스")doSomePrint(with:"레이블")
옵셔널 타입이기에 nil 도 허용되고, 함수 사용시 생략가능하다.
IUO 타입
(Implicity Unwrapped Optionals) 암시적 추출 옵셔널 타입
제한적인 상황에서 추출할 준비가 되어있는 타입 → 옵셔널 바인딩이 필요없다고 확신하는 경우
Non-optional 타입의 변수에 저장될 때, 값이 있는 경우 자동으로 값이 추출되어 저장되는 타입
varname:String!="홍길동"
💡 `nil` 을 할당할 수도 있지만, 로직상 항상 값이 있다는 것이 확신이 들 때 사용하는 타입이다.
규칙
제한적인 경우, 암묵적으로 추출한다.
별도의 추출하는 과정 없이 자동으로 옵셔널이 해제된다.
→ 제한적인 상황 Optional Type 을 Non-Optional Type 에 대입할 때 별도의 추출과정 없이 대입이 가능
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
옵셔널 타입을 사용하는 이유
값이 없는 데이터 공간에 접근하려고 하려면 에러가 발생한다.
옵셔널 (Optional) 타입
Int?
String?
nullPointException
)이 때 메모리 공간에 임시 타입인 옵셔널 타입으로 선언하여 값이 없을 땐
nil
이라는 임시값을 담아둔다.Int
정수형 타입과Int?
옵셔널 정수형 타입은 다른 타입이다.값이 있는 경우에는
Optional(10)
처럼 Optional 에 담아지기 때문에 사용할 때는Unwrapping (언래핑)
해서 사용해야한다.참고
Int?
는Optional<Int>
의 축약형태로 완전히 동일하다. But..Int?
로 선언할 때 → 실제 내부 구현에서Int?
타입은 항상nil
로 초기화된다.Optional<Int>
로 선언할 때옵셔널 (Optional) 타입 추출
Unwrapping (언래핑)
강제 추출
nil
이 아닌지 확인 후, 강제 추출옵셔널 바인딩
if let
guard let
Nil-Coalescing (닐 코얼레싱)
옵셔널 체이닝 (Optional Chaining)
→ 옵셔널 체이닝의 과정에서 값 중 하나라도
nil
을 리턴한다면, 바로nil
을 리턴한다.함수 관련 표기법
choco?.sit?()?.name
sit?
→ 함수가 없을 수 있다.sit?()?
→ 함수의 결과값이 없을 수 있다딕셔너리 관련 표기법
books?[”Apple”]?.name
books?
→ 딕셔너리가 없을 수 있다.books?[”Apple”]?
→ 딕셔너리의 결과값이 없을 수 있다.함수와 옵셔널 타입
옵셔널 타입 파라미터의 사용
IUO 타입
Non-optional 타입의 변수에 저장될 때, 값이 있는 경우 자동으로 값이 추출되어 저장되는 타입
규칙
제한적인 경우, 암묵적으로 추출한다.
별도의 추출하는 과정 없이 자동으로 옵셔널이 해제된다.
→ 제한적인 상황
Optional Type
을Non-Optional Type
에 대입할 때 별도의 추출과정 없이 대입이 가능옵셔널 (
String?
) 타입과 동일하다고 생각해도 무방하다.스토리보드와 Outlet 연결 시 주로 활용한다.
스위프트 공식문서 - The Basics / Optional Chaining
The Basics - The Swift Programming Language (Swift 5.6
Optional Chaining - The Swift Programming Language (Swift 5.6)
Beta Was this translation helpful? Give feedback.
All reactions