최근 몇주는 부트캠프 준비때문에 알고리즘을 빡세게 준비하느라 프로젝트나 CS 공부를 거의 못했지만.. 이젠 끝났으니 다시 시작. 요즘에는 기존 프로젝트를 리팩토링 하는 작업을 하고 있다. 만드는것보다 리팩토링 하는게 더 어렵다. 이번에는 객체지향 생활체조 원칙중 하나인 "모든 원시 값과 문자열을 포장합니다."를 준수해서 리팩토링 해보았다. 우선 리팩토링한 부분에 대해 설명하자면 아래와 같다. 첫번째 사진의 목표거리와 목표 시간의 숫자부분을 터치해서 설정화면으로 이동해서 거리와 시간을 설정하고 우측 상단의 설정버튼을 누르면 설정한 거리가 적용되도록 만들었던 기능이다. 리팩토링 전 목표 설정 로직은 다음과 같다. ViewModel에서 현재 목표 값을 목표 설정 화면을 생성할 때 할당한다. 이때 시간은 초단위..
우선 앱 시작 시퀸스는 다음과 같다. 1. Xcode에서 제공하는 main 함수를 시스템이 호출 2. main함수는 UIApplication과 app delegate를 생성하는 함수 UIApplicationMain()을 호출 3. UIKit은 Info.plist 혹은 Xcode의 타겟에서 지정한 기본 스토리보드를 로드함. 만약 스토리보드를 사용하지 않을 시 이 단계를 건너 뜀. 4. UIKit이 app delegate에서 application(_: willFinishLaunchingWithOptions:)를 호출 5. UIKit이 UI restoration process을 수행함. application(_:shouldRestoreApplicationState:)의 값이 true경우 수행하고, false일..
러닝앱에서 러닝을 끝내면 러닝 결과를 보여주는 화면이 나타난다. 이때 이 화면에서 지도와 함께 뛴 루트를 보여준다. 이때 지도를 넣고 오버레이를 그리는 방식으로 구현해도 되지만, 지도는 많은 자원을 사용한다. 단순히 경로를 보여주는 역할을 하기에는 자원 사용률이 높아서 과하다고 생각했고, 이를 이미지로 만들어서 보여줄 수 있는 방법이 없을까 했는데, MKMapSnapshotter라는게 있어서 사용해 보았다. MKMapSnapshotter 지도와 지도의 컨텐츠를 이미지로 캡처해 주는 기능을 제공하는 클래스 입니다. 지도를 보여주지만, 상호작용이 필요하지 않을때 사용하는 것을 추천하고 있습니다. 지도를 캡처할 때, 오버레이나 annotation 까지 같이 표시해주지 않습니다. 따라서 캡처한 이미지 위에 오버..
코드로 버튼을 생성하고 cornerRadius를 적용해 둥글게 만드려고 했는데, 적용되지 않았던 이슈가 있었다. 내가 알고 있던 것은 cornerRadius가 적용 안 되는 이유는 레이아웃이 아직 완전히 잡히질 않아서인데 ViewDidAppear에서 버튼을 add 하고, cornerRadius 세팅하는 함수를 호출하고 있어서 레이아웃이 아직 잡히질 않았을 리가 없어서 의아해서 해결 방법을 찾아보니, 레이아웃이 모두 잡혔을 때에서 호출되는 viewDidLayoutSubviews()에 호출하니 정상적으로 적용 되었다. ViewDidAppear일 때도 레이아웃이 모두 잡혀있을 텐데 왜 적용이 안될까 라는 궁금증이 생겨, 뷰가 화면에 그려지는 과정에 대해 알아보았다. 뷰가 화면에 그려지는 과정은 크게 3가지로 ..
함수의 인자값 전달은 기본적으로 call by value로 동작한다. 따라서 함수 내부에서 인자값을 변경하더라도 원래 값은 변경 되지 않기도 하고, 함수의 파라미터는 상수(let)로 선언되어있다. 따라서 아래와 같이 함수 내부에서 파라미터 값을 변경 하려고 하면, 오류가 발생한다. func changeValue(input: Int) { input = 10 } 하지만 class타입의 경우, class타입 내부에 있는 프로퍼티는 변경이 가능하다. class A { var a = 10 } func changeValue(input: A) { input.a = 20 } let classA = A() changeValue(input: classA) print(classA.a) // 20 출력 classA를 생성 할..