Toy Project/Swift Language Syntax

3. Swift Optional

개발자킹콩 2021. 1. 21. 16:23

//Optional: 있는 것과 없는 것을 모두 표현하기 위함
// 코드 중간에 ?, !가 들어가서 이상해 보일 수 있다.
// var name: String = "Joon"
// 없는 것에 대해 표현하기 애매하다. 없는 것을 어떻게 표현할 것인가!!
// var dogName: String = ???
// 존재하지 않음을 표현 : nil(없을 무), None과 유사

var carName: String? //Optional 변수의 표현

//여러분이 최애하는 영화배우 이름을 담는 변수 작성하기, 타입:String
//let num = Int("10") 에서 num의 type는?
var favoriteActor: String? = nil // 없을 수 있다.
print(favoriteActor)
//여기서 Int("10")은 정상적으로 타입변환이 이루어지지만, Int("10하이")의 경우 타입변환이 정상적으로 이루어지지 않아 num은 nil이 된다. 그렇기에 nil(None)를 담을 수 있는 type이 필요하고 num: Int? optional Int가 된다. 실제 type을 알아보면 Int?가 보여진다.



// 고급기능 4가지

// 1. Forced unwrapping (!)
// : optional 안의 값을 까서 사용하는 경우가 있는데 이때 강제로 unboxing하여 value를 가져오는 경우를 말한다.
print("1. Forced unwrapping")
var car1 :String?
car1 = "탱크"
print(car1) //Optional("탱크")
// 박스 내부에 "탱크"가 있는 구조이다. value만 가져와보자
print(car1!)
var car2 :String? = nil
print(car2)
// print(car2!) //박스내부가 없는데 뜯으려 하면 오류가 발생!!!


// 2. Optional binding (if let)
// : 부드럽게 박스를 까는 경우 1
print("2. Optional binding(if let)")
// car2의 값이 있는 경우 unwrappedCarName를 할당하고 print한다.
if let unwrappedCarName = car2 {
  print(unwrappedCarName)
} else {
  // print(unwrappedCarName) //할당이 되지 않았기에 오류발생!!
  print("Car Name 없다.")
}

func printParsedInt(from: String){
  if let parsedInt = Int(from){
    print(parsedInt)
  } else {
    print("Int로 컨버팅 안된다.")
  }
}
printParsedInt(from: "100")
printParsedInt(from: "100이다")
//조건문 몇개 더 쓰면, 레벨이 깊어져 복잡도가 상승할 수 있고, 코드 파악이 불편하다. Cyclomatic Complexity가 상승한다.(조건문에 의한 복잡도)


// 3. Optional binding (guard)
// : 부드럽게 박스를 까는 경우 2
print("3. Optional binding(guard)")

func printParsed(from: String){
  guard let parsedInt = Int(from) else{
    print("Int로 컨버팅 안된다 이말이야")
    return
  }
  print(parsedInt)
}

printParsed(from: "100")
printParsed(from: "100이다")



// 4. Nil coalescing
// : 박스를 까봤더니, 값이 없으면 디폴트 값을 줘보자

print("4. Nil coalescing")
var car3: String?
// car3 = "모델3"
let myCarName: String = car3 ?? "모델 S"
print(myCarName)
// car3가 nil이면 default값으로 "모델 S"를 지정하는 방식이다.


//도전과제
//1. 최애 음식이름을 담는 변수를 작성하시고(String?)
//2. optional binding를 이용해서 값을 확인해보기
//3. 닉네임을 받아서 출력하는 함수 만들기, 조건입력 파라미터는 String?

var favoriteFood: String?

func checkBinding1(from: String?){
  if let check = from {
    print("정상적 바인딩 \(check)")
  } else {
    print("삐빅! 비정상적 바인딩")
  }
}
func checkBinding2(from: String?){
  guard let check = from else{
    print("삐빅! 비정상적 바인딩")
    return
  }
  print("정상적 바인딩 \(check)")
}

checkBinding1(from: favoriteFood)
checkBinding2(from: favoriteFood)
favoriteFood = "피자"
checkBinding1(from: favoriteFood)
checkBinding2(from: favoriteFood)


func printName(inputName: String?){
  //아래 대입연산에서 Optional("하이하이") 박스를 부드럽게 개봉한다!!!
  guard let nickName = inputName else{
    print("바인딩 실패~") //nil은 바인딩 실패로 판단
    return
  }
  print(nickName) //값이 있으면 바인딩 성공으로 판단
}

var nickName1: String? = nil
var nickName2: String? = "하이하이"
printName(inputName: nickName1)
printName(inputName: nickName2)

'Toy Project > Swift Language Syntax' 카테고리의 다른 글

5. Swift Collection(Dicionary, Set)  (0) 2021.01.21
4. Swift Collection (Array)  (0) 2021.01.21
2. Swift Function  (0) 2021.01.21
1. swift basic  (0) 2021.01.21
0. 나의 개인 공부 페이지다  (0) 2021.01.21