일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- IOS
- 스벨트
- 계명대
- 비동기
- 개발
- 자스민
- queue
- jest
- javascript
- 자바스크립트 자료구조
- Hitit
- SWIFT
- 힛잇
- HTML
- hokeys
- 호키도키
- data structure
- 호키스
- TDD
- 자바스크립트
- 개발자
- hokidoki
- 이종호
- 계명대 이종호
- 자료구조
- 리액트
- Svelte
- 스위프트
- react
- 리액트 예제
- Today
- Total
Dog foot print
[SWIFT] Optional 본문
옵셔널이란 ?
옵셔널의 개념은 쉽게 풀이하여, 값이 존재 할 수도 있고 없을 수도 있음
을 표현한 자료형입니다. 다른 언어에서는 값이 없다는 표현으로 보통 null
을 할당 하고는 하는데, 스위프트에서는 nil
이라는 값으로 표현됩니다.
Dictionary 자료형을 사용 할 때, 키로 해당 값에 접근 하게되면 optional객체로 감싸진 값들을 볼 수 있습니다.
let country = ["korea" : "seoul"];
country["korea"] //Optional("seoul").
이는 스위프트가 오류가 존재해서가 아닌, “korea”라는 키를 가진 value가 없을 수 도 있으니 바로 오류를 범하기 전에Optional
객체로 감싼 결과 입니다.
이 예시는 String을 Int형으로 변경 할 때도 발생합니다.
Int("123") // Optional(123);
Int("swift") // => nil
만약 123이 아닌 다른 hello world
같은 것을 타입 캐스팅을 하고, 다음 코드에서 이 코드가 숫자형인줄 알고 사용하려 했다면 앱이 강제 종료되게 됩니다. 이를 방지 하기 위해 Optional
객체로 감싸지게 된 것 입니다 .
옵셔널 타입 선언과 정의
만약 옵셔널 타입을 선언해주고 싶다면, 타입 선언 자료형에 ?
를 붙여주시면 됩니다.
var appple : String? = "optional string";
var number : Int? = 123;
var numbers : Int[]?;
Unwrapping
Optional(123) + Optional(123) // 연산 불가
Int("123")
의 결과는 Optional(123)
이기 때문에 이 옵셔널 값을 바로 연산에 사용 할 수 없습니다. 즉 Optional(123)
은 정확히 숫자 123과 다른 값입니다. 그렇기에 이 값을 사용 할 수 있게 Optional객체를 해제해줘야 하는데, 이를 unwrapping
이라 부릅니다.
Force unwrapping
let a = Int("123");
print(a!); // 123
Force unwrapping
은 강제로 옵셔널을 제거해주는 방법입니다. 사용 문법은 optional 객체에 !
를 붙여서 unwrapping 합니다. 그러나 이 방법은 위험이 동반 됩니다. 강제로 언 래핑 하였기 때문에 값이 nil
일수도 있는 위협이 존재합니다. 그러므로 사용시에는 정말 강한 확신이 존재하는 경우에만 사용 되어야 합니다.
Optional binding
if let result = Int("123"){
print(result);
}else{
//여기서는 result에 접근 불가
print("숫자가 아닙니다.")
}
상수에 옵셔널 값을 할당하게 되면 nil인 경우에는 false
를 반대의 경우에는 true
를 반환 합니다. 그로 인하여, if문 내부에서 자연스럽게 unwrapping
된 바인딩 상수를 사용 할 수 있게 되는 것 입니다.
automatic Unwrapped Optional
let a : Int? = 32 // optional(32)
if a == 32{
print("32 입니다.")
}else{
print("32가 아닙니다.")
}
옵셔널로 감싼 타입은 그 값을 확인하려면, unwrapping을 이용해야 합니다. 그러나, 이를 사용하지 않아도 되는 순간이 있는데 바로 비교 연산자
를 사용 할 때 입니다. 만약 옵셔널 객체를 비교 연산자를 통해 비교하는 순간이 존재하면, 그때는 옵셔널 객체를 해제하고 그 값과 비교합니다. 물론 옵셔널 바인딩 처럼 그 하위 코드 블록에서 force unwrapping
해주어야 하는 것은 동일합니다.
correspond ??
let a = Int("123");
let b = Int("swift");
let result = (a ?? 0) + (b ?? 0); // 123
것은 만약 해당 값이 `nil`인 경우에는 `??` 옆에 있는 값으로 대체하겠다는 구문입니다.
은 force unwrapping을 해줄 필요 없이, 해당 구문에서 사용이 가능하기 때문에, 기본값을 부여 할 수 있을 때 유용하게 사용 될 수 있습니다.
Implicity unwrapped optional
let a : Int! = Int("123");
print(a) // 123
묵시적 해제는 절대 nil
이 아닌 값을 언 래핑 하겠다는 의미입니다. Optional 값을 사용하기 위해서는 force unwrapping 혹은 optional binding을 이용하여야 하지만 Optional 객체를 쓰긴해도 절대 nil
이 아니라면 optional 객체를 무조건 force unwrapping 하겠다는 의미 입니다.
Note : 이 형태는 Optional 객체를 무조건 force unwrapping 하기 때문에, 절대적인 확신이 존재하지 않다면 사용을 권장 하지 않습니다.
'IOS > Swift' 카테고리의 다른 글
[Swift] Inout (0) | 2021.07.08 |
---|---|
[SWIFT] 함수 시작하기 (0) | 2021.07.07 |
[SWIFT] Dictionary (0) | 2021.07.05 |
[SWIFT] Set 집합 (0) | 2021.07.01 |
[SWIFT] 문자열 보간법과 트리플 쿼우팅 (0) | 2021.06.30 |