값을 가지고 있는경우, 값을 가지고 있지 않은 경우를 둘다 표현할수 있습니다 nil : 무, 전무의 객체안에 데이터가 있을 수도 없을 수도 있는 경우에는 nil을 써서 표현한다.
let actor: String? = nil
// nil 을 표현 let num = Int("10")
// num의 타입은 옵셔널 Int타입이다
#옵셔널의 고급 기능 4가지
- Forced unwrapping
- Optional binding (if let)
- Optional binding (guard)
- Nil coalescing
1. Forced unwrapping
- 억지로 박스를 까서 값을 가져오는 방법
var carName: String? //값이 있을수도있고 없을수도있다
carName = "없어요"
print(carName!)
// 출력 : "없어요" // 사용은 ! 를 쓰면 된다 // !안붙이면 출력 : Optional("없어요")
2. Optional binding(if let)
- 부드럽게 박스를 까보기
var carName: String? //값이 있을수도있고 없을수도있다
carName = "없어요"
if let unwrapperdCarName = carName {
// carName에 값이 있을경우 unwrapperdCarName에 변수값을 할당하고, 없는경우에는 else의 실행코드를 출력 , 알아둘것은 nil은 값이 아니다.
print(unwrapperdCarName)
} else {
print("Car Name 없다")
}
func printParsedInt(from: String) {
if let parsedInt = Int(from) {
print(parsedInt)
} else {
print("Int로 컨버팅 안된다 짜샤. ")
}
}
printParsedInt(from: "헬로우 마이네임이즈")
##### cyclomatic complexity 함수안에서 if문이 너무 남용되면 뎁스가 깊어져서 코드가 복잡해진다
이럴때는 복잡성을 낮추는 작업을 나중에 해줘야한다.
3. Optional binding (guard)
- if 구문과는 다르게 guard구문은 항상 else 구문이 뒤에 따라와야 합니다
- guard문 뒤에 오는 실행문이 참일때 else실행문 다음의 실행문이 실행됩니다.
- 내부 코드에는 자신보다 상위 코드 블록을 종료하는 코드가 반드시 들어가게 되고 코드블럭 종료 제어문은 return, break, continue, throw가 있습니다
- 장점
- guard구문 사용시 if 코드를 훨씬 간결하고 읽기 좋게 구성 가능합니다
- 예외사항만을 처리하고 싶다면 gurad구문을 사용하는 것이 훨씬 간편합니다
- if문에서 선언된 변수 또는 상수는 영역 밖에서 참조할수 없지만 가드에서 선언된 변수 또는 상수는 밖에서 참조할수 있습니다
- 또한 소스의 Depth가 변경되지 않습니다
- 부드럽게 박스를 까보자2
func printParsedInt2(from: String) {
guard let parsedInt = Int(from) else {
print("Int로 컨버팅 안된다 짜샤") return
}
print(parsedInt)
}
printParsedInt2(from: "100")
// 가드 문법은 첫줄에 선언되는 대상의 값이 있으면 바로 아래 프린트쪽으로 가고 만약 값이 없으면 else쪽으로
가서 지정된 프린트를 출력하고 리턴해서 빨리 나오게 하는 방법이다 결과적으로 이방법은
// cyclomatic complexity를 줄일수 있게 해주는 방법이다.
4. Nil coalescing
- 박스를 까봤더니, 값이 없으면 디폴트 값을 주도록 해보자
carName = nil
let myCarName: String = carName ?? "모델 S"
// 얘를 문자열로 하고싶은데 만약 얘가 nil이면 "모델 S"라고 해줘 라고하는 것이다
물음표 ??(Nil coalescing)을 사용하면 조건을 줄수있다.
5. 도전과제
//--- 도전과제
// 1. 최애 음식이름을 담는 변수를 작성 (String?)
// 2. 옵셔널 바인딩을 이용해서 값을 확인해 보기
// 3. 닉네임을 받아서 출력하는 함수 만들기, 조건 입력 파라미터는 String?
let favFood: String? = "감자탕"
print(favFood!)
let expose: String = favFood ?? "앙없자나"
if let myyyyfood = favFood {
print(myyyyfood)
} else {
print("없다")
}
func exposing(name: String?) {
guard let myFav = name else {
print("응 그런거 없어")
return
}
print(myFav)
}
exposing(name: nil)
'IOS > Swift' 카테고리의 다른 글
[TIL] Swift. Function Expression (0) | 2020.09.29 |
---|---|
[TIL] Swift. Collection (0) | 2020.09.29 |
[TIL]Swift. Function (0) | 2020.09.23 |
[TIL] Swift. Flow Control (0) | 2020.09.22 |
[TIL] Swift 기초 정보 (0) | 2020.09.21 |