IOS/Swift

[TIL] Swift. Optional

값을 가지고 있는경우, 값을 가지고 있지 않은 경우를 둘다 표현할수 있습니다 nil : 무, 전무의 객체안에 데이터가 있을 수도 없을 수도 있는 경우에는 nil을 써서 표현한다.

let actor: String? = nil 
// nil 을 표현 let num = Int("10") 
// num의 타입은 옵셔널 Int타입이다

#옵셔널의 고급 기능 4가지

  1. Forced unwrapping
  2. Optional binding (if let)
  3. Optional binding (guard)
  4. 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