RunWay 1.4 (2) 분석은 모르지만 AI랑 만들어본 Debrief
RunWay는 러닝 앱인데, 정작 나는 러닝 분석에 대한 지식이 거의 없다. 스플릿이 어떻게 흘러야 좋은 페이싱인지, 심박이 어떤 식으로 움직이면 문제인지 하나도 모르는 상태에서 시작했다. 그래서 이번 기능은 처음부터 끝까지 AI한테 물어가면서 아이디어를 받고, 그걸 코드로 옮기고, 실기기로 확인하면서 고쳐나간 과정을 그대로 정리했다. 목표는 러닝 ...
RunWay는 러닝 앱인데, 정작 나는 러닝 분석에 대한 지식이 거의 없다. 스플릿이 어떻게 흘러야 좋은 페이싱인지, 심박이 어떤 식으로 움직이면 문제인지 하나도 모르는 상태에서 시작했다. 그래서 이번 기능은 처음부터 끝까지 AI한테 물어가면서 아이디어를 받고, 그걸 코드로 옮기고, 실기기로 확인하면서 고쳐나간 과정을 그대로 정리했다. 목표는 러닝 ...
1.3.2를 심사에 넣고 1.4를 시작했다. 할 일이 여덟 가지쯤 되는데, 그중 하나만 성격이 달라서 순서를 그것부터 잡았다. 1.3.3을 1.4에 합친 이유 원래는 작은 버전을 하나 끼워 넣을 생각이었다. 이유는 딱 하나였다. 좌표에 시각을 저장하는 작업은 미루는 만큼 그대로 잃는다. 나중에 필드를 추가해도 그 전에 저장된 기록에는 값이 없...
시작하게 된 이유 이전글에서 Udemy 강의를 따라가며 async let, Task Group, Task { }, Task.detached를 한 번씩 써봤다. 그다음 글에서는 랜덤 이미지 앱에 async let과 Task Group을 적용해봤다. 그때는 강의 흐름대로 “이렇게 쓰면 동시에 돈다” 정도로 정리하고 넘어갔다. 그런데 이번 Deep ...
시작하게 된 이유 이전글 끝에서 Task와 await의 역할을 정리했다. Task는 기다릴 수 있는 공간을 만들고, await는 그 공간에서 actor에 들어갈 차례를 기다린다. actor는 한 번에 하나씩만 들어오게 해주니까, 차례를 지켜서 들어가면 안전하다고 생각했다. 그런데 다음 주제를 고르다가 “actor인데 상태가 꼬인다”는 말이 나왔...
시작하게 된 이유 이전글에서 Task에 Sendable이 아닌 값을 넘기는 실험을 했다. 함수 안에서 새로 만든 값은 넘어갔고, 넘긴 뒤에 또 쓰거나 파라미터로 받은 값은 sending ... risks causing data races 에러로 막혔다. 같은 타입인데 결과가 갈렸다. 그때는 결과만 적고 넘어갔는데, 이렇게 “타입이 아니라 값을 ...
이전 글에서 GPWS 경고와 건강 앱 중복 저장을 고쳤다. 1.3.2를 마무리하면서 두 개를 더 손봤는데, 앞의 둘과 성격이 달라서 따로 적는다. 7일 리마인더와 Pre-flight Check의 APPLE WATCH 항목이다. 기능도 화면도 다른데 틀린 자리가 같았다. 둘 다 기능이 실제로 필요로 하는 조건 대신, 그때 손에 잡히던 값을 기준으로 ...
시작하게 된 이유 nonisolated를 실전에서는 에러 지우는 용도로만 써봤다. actor isolation 에러가 나면 일단 nonisolated를 붙이거나 Task { @MainActor in }으로 감싸서 넘어갔는데, 정작 “이게 정확히 뭘 하는 키워드인가”는 설명 못 한다. 이번엔 실제 프로젝트 사례를 뒤지는 대신, nonisolated 하...
Doubly Linked List — class가 필요한 진짜 이유 새 프로젝트(멀티플랫폼 앱, landscape 고정)로 시작해서, 제네릭 doubly linked list를 구현한다. 왜 struct가 아니라 class인가 class DoublyLinkedListNode<T> { var value: T var pr...
Part 6: Memoization — 재귀의 비효율을 실측으로 확인하기 Recursion은 종종 값비싼 연산이다. Memoization은 이전에 계산한 결과를 일종의 메모장(캐시)에 저장해뒀다가, 같은 계산이 다시 필요할 때 재사용해서 성능을 크게 끌어올리는 기법이다. 전형적인 예시가 Fibonacci 수열이고, 여기서는 그 확장판인 four-bo...
Part 5: Recursion 시작하기 Recursion(재귀)을 다루는 새 섹션이다. 재귀 함수는 자기 자신을 호출하는 정의를 가진 함수이고, 언젠가 멈추게 만드는 조건(base case)이 반드시 있어야 한다. 전형적인 예가 factorial이다. 반복문으로 짜면 n! = 1 × 2 × 3 × ... × n이지만, 재귀적으로 정의하면 이렇다....