Processing URL Session Data Task Results with Combine 에 나오는 내용입니다. [ 목표 ] Combine으로 네트워크 쪽 코드를 작성하는 것은 크게 두가지 절차를 거칩니다. 1. Data Task Publisher 를 만든다. 2. 비동기 연산자 (asynchronous operator) 들을 체이닝하여 data를 받고 처리한다. 이를 알아봅니다. 또한 네트워크 쪽 코드작성할 때 필요한 에러 핸들링, 스케쥴링, share 도 알아봅니다! [1] Data Task Publisher 만들기 URLSession 은 Combine Publisher 인 URLSession.DataTaskPublisher 를 제공합니다. func dataTaskPublisher(for: U..
단위 테스트 1~3장 내용을 기반으로 하고 있습니다. 1장 단위테스트의 목표 # 단위테스트 현황 논쟁은 '단위 테스트를 작성해야하는가?' 에서 '좋은 단위 테스트를 작성하는 것은 어떤 의미인가?' 로 바뀌었다. # 단위테스트의 목표 - 소프트웨어 프로젝트의 지속 가능한 성장을 가능하게 하는 것 지속가능한 프로젝트 성장을 위해서는 고품질 테스트에만 집중해야한다. (사람들은 종종 테스트가 많으면 많을 수록 좋다고 생각한다. 하지만 그렇지 않다. 코드는 자산이 아니라 책임이다. 코드가 많아질 수록, 소프트웨어 내의 잠재적인 버그에 노출되는 표면적이 더 넓어지고 프로젝트 유지비가 증가한다.) 테스트는 코드의 단위가 아니라 동작의 단위. 즉 문제 영역에 의미가 있는 것. 이상적으로는 비즈니스 담당자가 유용하다고 ..
단위 테스트 3장 내용을 기반으로 하고 있습니다. [ 저자가 생각하는 단위테스트 네이밍 안티패턴 ] 1. 엄격한 명명구조 가장 유명하지만 가장 도움이 되지 않는 방법 중 하나가 다음과 같은 관습이다. [테스트 대상 메서드]_[시나리오]_[예상결과] - 테스트 대상 메서드: 테스트 중인 메서드의 이름 - 시나리오: 메서드를 테스트하는 조건 - 예상결과: 현재 시나리오에서 테스트 대상 메서드에 기대하는 것 동작 대신 구현 세부사항에 집중하게끔 부추기기 때문에 분명히 도움이 되지 않는다. 간단하고 쉬운 영어 구문이 훨씬 더 효과적이다. 예를들어 public class CalculatorTests { public void Sum_of_two_numbers() { ... // when double result =..

SwiftUI Tutorials > Animating Views and Transitions 에 나오는 내용을 기반으로 하고 있습니다. 목표 SwiftUI가 제공하는 effect 들을 써보고 (이 글에서는 rotationEffect, scaleEffect 사용) 여러 effect를 조합하여 애니메이션 시키는 법을 알아봅니다. [1] rotationEffect struct DetailButtonImage: View { var body: some View { Image(systemName: "chevron.right") .frame(width: 50, height: 50) .background( Circle().foregroundColor(.white) // Shape의 fill을 써도 됨. ) .shado..
[SwiftUI] re-rendering, re-draw 추측 에서 SwiftUI가 내부적으로 리렌더링을 어떻게 결정하는 지 추측해보았는데요 리렌더링을 커스터마이징 (?) 할 수 있는 방법도 있습니다. # 1. SwiftUI 는 다시 안그리는데, 나는 다시 그리고 싶은 경우 뷰는 extract subview를 하면 별도의 identity를 부여받아, 부모 뷰와 같이 리렌더링이 안됩니다. 부모의 body가 재호출될 때 extracted 한 서브뷰를 항상 같이 다시 그리고 싶으면 id를 활용합니다. [ 기본 동작 ] ContentView의 body가 호출될 때 NoMatterText는 다시 안그려짐 struct ContentView: View { @State private var isOn = true pri..
[ 인트로 ] SwiftUI는 state-driven, data-driven 방식으로 state 가 변하면 view 를 다시 그립니다 (body를 호출하여) 하지만 body를 재호출한다고 모든 것을 다시 그리는 것이 아니라 변경이 필요한 부분만 다시 렌더링 합니다. 그렇다면.. re-rendering 또는 re-draw를 결정하는 SwiftUI의 diff 판단 로직은 어떻게 될까요? (= body가 호출될 때 무엇을 다시 그리고, 무엇을 다시 안그릴 지 어떻게 결정할까요?) WWDC21 - Demystify SwiftUI 를 보면 identity, life time, dependencies 이 세가지 요인이 메인요소인 것 같습니다. 저는 이 중에서 identity 위주로 저의 re-rendering 추측..
Library, Framework, Swift Package 궁금한 것들을 확인해보고 정리합니다. 테스트를 위한 MyApp workspace 를 하나 만들고 시작합니다. [1] Library # 만들기 File > New > Project > Static Library 선택 MyStaticLibrary 라는 이름으로 만들고 아래처럼 경로 / Add to / Group 을 설정해줍니다. # 기본 정보 Target에 가보면 Mach-O Type이 static library 로 세팅 되어있으며 (Project는 Mach-O Type이 명시 안되어있음) 앱에 embed 하면 .a 확장자를 볼 수 있습니다. # 궁금! 만약 Mach-O Type 을 dynamic library 로 바꾸면..?! 다시 import를..
[1] ISA Swizzling Method Swizzling이 런타임에 특정 메서드를 다른 메서드로 바꿔서 실행될 수 있게 하는 것이라면, ISA Swizzling은 런타임에 특정 객체를 다른 객체로 바꿔서 실행될 수 있게 하는 것을 말합니다. (isa 는 포인터를 의미합니다) object_setClass 를 이용해서 isa swizzling을 할 수 있습니다. 예를들어 나의 커스텀 탭바를 사용하고 싶은 상황을 봅시다. TabBarController의 tabBar 프로퍼티는 get only 이고 이를 세팅할 수 없는 이니셜라이저나 메소드가 없습니다. 이 때 isa swizzling을 통해 기본 탭바를 서브클래싱한 커스텀 탭바를 사용할 수 있습니다. private class CustomTabBar: UI..
☑️ 이 글의 제목 - status bar를 hidden한 뷰컨트롤러를 푸쉬했다가 back 했을때 navigation bar가 shrink 되는 현상 - status bar를 hidden한 뷰컨트롤러를 푸쉬했다가 back 했을때 navigation bar 가 status bar 와 overlap 되는 현상 (두가지를 계속 고민하다가 결국 둘다 너무 길어서 찐제목에는 키워드만 적음,,,) ☑️ 주된 테스트 환경 Xcode 13.4.1 / iOS 15 [1] 준비 아래와 같은 상황으로 준비해줍니다 (feat. 노치없는 시뮬레이터!) - A 는 네비게이션의 root 이다. - A 에서 B 를 푸쉬한다 import UIKit class MyNavigationController: UINavigationContro..

Swift-Collections 패키지(Commonly used data structures for Swift) 에 있는 deque 라는 자료구조를 살펴보겠습니다. deque는 파이썬에서 오래전부터 많이 봐왔던 친구라.. 파이썬 문서랑 Swift 문서를 함께 살펴볼게요! [1] Deque 란 ? - deque는 "double-ended-queue" 의 줄임말입니다. 발음은 "deck" 이라고 합니다. - 양쪽 끝에서 삽입, 삭제가 가능한 큐입니다. (파이썬 문서에서는 'Deques are a generalization of stacks and queues' 라고 말합니다) - array 와 굉장히 비슷합니다. deque와 array 는 모두 ordered, random-access, mutable, ra..
- Total
- 867,868
- Today
- 438
- Yesterday
- 1,696
- Watch App for iOS App vs Watch App
- ribs
- flutter build mode
- 장고 URL querystring
- Django Firebase Cloud Messaging
- Flutter Spacer
- Dart Factory
- DRF APIException
- SerializerMethodField
- Django Heroku Scheduler
- flutter 앱 출시
- Sketch 누끼
- Flutter 로딩
- ipad multitasking
- cocoapod
- Flutter Text Gradient
- github actions
- flutter dynamic link
- PencilKit
- 플러터 얼럿
- Django FCM
- 플러터 싱글톤
- drf custom error
- 구글 Geocoding API
- flutter deep link
- Python Type Hint
- Flutter Clipboard
- 장고 Custom Management Command
- Flutter getter setter
- METAL