//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 |