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..

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..

WWDC 2022 > Embrace Swift Generics ์ ๋์ค๋ ๋ด์ฉ์ ๋๋ค. Feed (์ฌ๋ฃ, ๋จน์ด) ๋ฅผ associatedtype์ผ๋ก ๊ฐ์ง๋ Animal ํ๋กํ ์ฝ์ ์์ ๋ก ์ฌ์ฉํฉ๋๋ค. [1] AS IS Farm์ feed๋ผ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋, ์๋ ๋๊ฐ์ง ์ค ํ๋์ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์คฌ์ด์ผํ์ต๋๋ค. ๋ฉ์๋๊ฐ ์ข ๋ณต์กํด๋ณด์ ๋๋ค. [2] TO BE ํ์ง๋ง!! ์ด์ opaque type์ธ some์ ์ฌ์ฉํ์ฌ, ์๋์ ๊ฐ์ด ๊ฐ๋จํ ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Swift 5.7๋ถํฐ๋ some์ parameter type์๋ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค ๐ (์ด์ ์๋ ํ๋กํผํฐ ํ์ , ๋ฆฌํด ํ์ ์๋ง ์ธ ์ ์์์) [3] some ๊ณผ any (1) ํ์ง๋ง,, some์ ์ ์ฝ์ด ์๋๋ฐ,, ์๋์ ๊ฐ์ด..
[1] RELEASE ํ๋๊ทธ ๋ณดํต ์ฑ์ ๋ง๋ค๋ฉด DEBUG ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ ๊ธฐ๋ณธ์ผ๋ก ์ถ๊ฐ๋์ด์๊ณ RELEASE ํ๋๊ทธ๋ฅผ ์ง์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ์์ ์ข ์ข ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด์ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() #if RELEASE print("๋ฆด๋ฆฌ์ฆ") #else print("๋ฆด๋ฆฌ์ฆ ์๋") #endif #if DEBUG ... } } ๊ทธ๋ผ Local Swift Package ๋ฅผ ์ฑ์ embed ํด์ ์ฐ๋ ๊ฒฝ์ฐ, Swift Package ์์์๋ ์ฑ ๋น๋์ธํ ์ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์๊น์? ํ ์คํธํด๋ณด๋ฉด #if DEBUG ๋ ํ๊ณ #if REL..
- Total
- 867,868
- Today
- 438
- Yesterday
- 1,696
- PencilKit
- Flutter getter setter
- DRF APIException
- ์ฅ๊ณ Custom Management Command
- ribs
- Flutter ๋ก๋ฉ
- cocoapod
- drf custom error
- Django FCM
- Django Firebase Cloud Messaging
- SerializerMethodField
- flutter dynamic link
- flutter deep link
- ํ๋ฌํฐ ์ฑ๊ธํค
- Flutter Clipboard
- github actions
- ์ฅ๊ณ URL querystring
- Django Heroku Scheduler
- Flutter Spacer
- Dart Factory
- METAL
- Watch App for iOS App vs Watch App
- Python Type Hint
- ipad multitasking
- flutter ์ฑ ์ถ์
- ํ๋ฌํฐ ์ผ๋ฟ
- Sketch ๋๋ผ
- Flutter Text Gradient
- ๊ตฌ๊ธ Geocoding API
- flutter build mode