다음 스크린으로의 전환 (in an animated way)
세그웨이를 불러올 수 있게 Identifier 지정
prepare 함수: A method we inherit from UIViewController (따라서 override)
if문: segue가 여러개 존재할 경우를 대비 (view 여러개일 경우)
destination: the view that segue triggers
as: downcasting UIcontroller to ResultViewController
(destination의 대상 datatype은 UIcontroller이므로)
!: forced downcast,
"goToResult"가 ResultViewController로 연결될 것이라는 확신의 unwrapping
bmiValue를 destinationVC(ResultViewController)의 bmiValue로 패스해줌
Xcode는 똑똑해서 우리가 dismiss를
현재 클래스 내에서 쓰고있다는 것을 알고있기 때문에
self는 굳이 안붙여도 되긴 하다.
기본적으로 segue로 넘어가는 페이지는
기존 페이지 위로 겹쳐서 보인다.
3D로 이러한 페이지들의 hierarchy를
볼 수 있는 버튼이 있는데
갑자기 내 Xcode에서는 보이지 않는다…
왜 없어졌지…
모야 어디갔어…
Force Unwrapping
String과 String?은 전혀 다른 데이터 타입이기 때문에
서로 호환되지 않는다.
따라서 위와 같은 코드에서 작동하지 않게 된다.
이를 해결하기 위해서는 “!”을 붙혀준다.
우리가 해당 데이터 타입이 String임을
100프로 확신할 때 사용할 수 있는 방법이다.
Check for nil Value
만약 해당 변수에 nil 값이 할당되어 있다면?
Force Unwrapping으로 인해
치명적인 에러가 발생하게 된다.
보통 프로젝트를 진행하며 모든 변수의 데이터 타입을
인간 프로그래머가 일일히 관리할 수는 없는 노릇이다.
따라서 nil 값이 있는지 확인해주는 if 문을 삽입할 수 있다.
그러나 이렇게 되면 너무 귀찮고 많은 코드를 소요한다.
Optional Binding
상자를 열어서 myOptional의 값이 있으면
safeOptional에 임시적으로 할당하고,
nil이면 스킵하고 바로 else문으로 가는 방법.
이 또한 임시방편이다.
Nil Coalescing Operator
optional ?? defaultValue
nil이 아니면 optional 안의 값을 그대로 사용하고,
nil일 경우 defaultValue로 치환해준다.
결과값:
Optional Chaining
optional이 구조체라고 가정해보자.
property의 속성이 Int라고 해도
구조체가 옵셔널일 경우 접근할 수 없게 된다.
이 때 옵셔널 체이닝을 사용할 수 있다.
optional?.property
optional?.method()
이 기능을 사용하면 optional이 nil이 아닐 경우에
property와 method에 접근할 수 있게 된다.
실행결과: 크래시가 나진 않지만
다른 값을 불러오지도 못하게 된다.
실행결과: 잘 작동한다.
else if는 이미 위의 if문의 조건을 배제한 상태임
(뭔가 나자신이 바보같이 느껴졌던 대목...)
// 비효율적 조건문
if bmiValue < 18.5 {
print("underweight")
} else if bmiValue > 18.5 && bmiValue < 24.9 {
print("normal weight")
} else {
print("overweight")
}
//이미 언급된 조건은 넣지 않아도 됨
if bmiValue < 18.5 {
print("underweight")
} else if bmiValue < 24.9 {
print("normal weight")
} else {
print("overweight")
}