Udemy iOS by Angela Yu / Section 10 / Segues, More about optionals

Garam·2023년 6월 27일
0

Udemy iOS by Angela Yu

목록 보기
5/9

Segue


다음 스크린으로의 전환 (in an animated way)



세그웨이를 불러올 수 있게 Identifier 지정



bmiValue를 세그웨이와 연결된 페이지로 보내려면
어떻게 해야할까?
먼저 CalculateViewController 클래스의
내부 전역에서 쓸수있는
bmi 변수를 생성해준 뒤
슬라이더로 얻어낸 값들을 해당 변수에 패스해준다.



이후 아래 코드를 작성한다. 코드를 하나하나 뜯어 보자면 이렇다.

  1. prepare 함수: A method we inherit from UIViewController (따라서 override)

  2. if문: segue가 여러개 존재할 경우를 대비 (view 여러개일 경우)

  3. destination: the view that segue triggers

  4. as: downcasting UIcontroller to ResultViewController
    (destination의 대상 datatype은 UIcontroller이므로)

  5. !: forced downcast,
    "goToResult"가 ResultViewController로 연결될 것이라는 확신의 unwrapping

  6. bmiValue를 destinationVC(ResultViewController)의 bmiValue로 패스해줌


이후 ResultViewController에서 viewDidLoad 안에 bmiLabel.text = bmiValue로 설정해주면 무사히 값을 넘길 수 있다.

Xcode는 똑똑해서 우리가 dismiss를
현재 클래스 내에서 쓰고있다는 것을 알고있기 때문에
self는 굳이 안붙여도 되긴 하다.


  • View Hierarchy

기본적으로 segue로 넘어가는 페이지는
기존 페이지 위로 겹쳐서 보인다.
3D로 이러한 페이지들의 hierarchy를
볼 수 있는 버튼이 있는데
갑자기 내 Xcode에서는 보이지 않는다…
왜 없어졌지…
모야 어디갔어…



Optionals



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에 접근할 수 있게 된다.


  • 옵셔널이 nil일 때 체이닝을 했을 경우

실행결과: 크래시가 나진 않지만
다른 값을 불러오지도 못하게 된다.

  • 옵셔널이 초기화된 상태일 때 체이닝을 했을 경우

실행결과: 잘 작동한다.



그 외 작은 팁


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")
}



0개의 댓글