๐ป ๊ฐ๋ฐ/iOS
์ง๊ธ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์์ ๋์์ธ ์์คํ
์ ๋์
ํ๊ณ ์๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๋์์ธ์ด ๊ตฌ์์ด ๋์ด ์์ด์, ์ด๋ฅผ ๊ทธ๋๋ก ๊ตฌํํ๋ฉด ๋๋ ์ํฉ์ด์์ง๋ง ProgressView๋ ๋ช
์๋ ๋์์ธ์ด ์์๋ค. ๊ทธ๋์ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ, ์ฑ์ Identity์ UX๋ผ๋ ๋ ๋ง๋ฆฌ์ ํ ๋ผ๋ฅผ ๋ชจ๋ ์ก์๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์ด๋ฅผ ์ํด, ์ฐ๋ฆฌ ์ฑ์ ๋ก๊ณ ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ํ์ง๋ง ๋จ์ํ ๋ก๊ณ ๋ง ๋์ด์ฃผ๊ธฐ์ ์ด์์ง๋ ์๊ณ , ์ผ๋จ UX์ ์ผ๋ก ๋ง์์ ๋ค์ง ์์๋ค. Why? ๐ง ProgressView๋ ์ด๋ ํ ์์ฒญ(ex, API Request)์ ๋ํ ์๋ต์ ๋ฐ๊ธฐ ์ ๊น์ง์ ๋ก๋ฉ์ ์์์ ์ผ๋ก ํํํ๋ ๊ฒ์ธ๋ฐ, ๋จ์ํ ๋ก๊ณ ๋ง ๋ก ๋์ด๋์ผ๋ฉด ์ฌ์ฉ์๋ ์ด๊ฒ ๋ฌด์จ ์ํฉ์ธ์ง ์ ํ ์ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋์ Dynamicํ ์์๊ฐ ํ์ํ๋..
๐ป ๊ฐ๋ฐ/iOS
๋ฉ์์ด์ฌ์์ฒ๋ผ iOS ์ฑ ์ค์ฟจ์์ ์ต์ข
ํ๋ก์ ํธ๋ก ๋จ์ด์ฅ ์ฑ์ ๋ง๋ค๋ฉด์, AVSpeechSynthesizer๋ฅผ ํ์ฉํ์ฌ TTS ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ๊ตฌํ ๊ณผ์ ์์ ์์์น ๋ชปํ? ์ค๋ฅ๋ฅผ ๋ง๋ฌ๊ณ ์๊ฐ๋ณด๋ค ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ์๋ค. ์ฝ๋ ์์ผ๋ก๋ ์ ํ ๋ฌธ์ ๊ฐ ์์๋๋ฐ ๋ง์ด๋ค. (์ง์ง๋ก? ๋ฌธ์ ์๋ ๊ฑฐ ๋ง์?) ๊ทธ๋ ๊ฒ ๊ณ ๋ฏผํ๋ ์ค, ๊ฒฐ๊ตญ View Memory Graph Hierarchy๋ฅผ ํตํด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค. ์ฒ์ ์จ๋ดค๋๋ฐ ์ ๋ง ์ ์ฉํ ์น๊ตฌ๋ผ๋ ๊ฑธ ๊นจ๋ฌ์๋ค. ์๋ฌดํผ ์ค๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์ด์๊ฐ ์์ ๋ ์ฌ์ฉํ๋ฉด ์ ๋ง ์ ์ฉํ ์น๊ตฌ๋ฅผ ์๊ฐํ๊ณ ์ ํ๋ค. ๊ทธ ์ ์, AVSpeechSynthesizer๋ ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์์๋ณด๋๋ก ํ์. AVSpeechSynthesizer์ ๋์ ๊ณผ์ ์ฝ๋๋ก๋ ์ด๋ ๊ฒ..
๐ป ๊ฐ๋ฐ/Architecture
SwiftUI์์๋ @ObservableObject ๋๋ถ์ ViewModel(์ญํ ์ ํ๋?)์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. ๋๋ถ์ ์ค์ต์ ์งํํ๋ฉด์ ๋๋ถ๋ถ์ ํ๋ก์ ํธ์์ ViewModel๋ก ๋ถ๋ฆฌ๋ ํ์ง๋ง ๋ฌธ์ ๊ฐ ๋ง์๋ค. ์ผ๋จ SwiftUI๊ฐ View ์์ฒด์ ์ผ๋ก Data Binding์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ViewModel์ด ๋
น์๋ค์ด๊ฐ ๋๋์ด๋ค. ํ์ง๋ง ์ด๊ฒ๋ณด๋ค๋ ํ๋์ ViewModel์์ ์ฌ๋ฌ ์์
์ ์งํํ๋ค๋ณด๋ Massive ViewModel์ด๋๊น? ViewModel์ด ๋น๋ํด์ง ๋๋์ด ๋ค์๊ณ , ๊ทธ๋์ ํด์ปคํค ๋๋ ์ด๋ฐ ๊ฒ๋ค์ ๊ฑท์ด๋ด๊ณ ์ํคํ
์ณ์ ์ผ๋ก ์กฐ๊ธ ๋ ๊ด์ฐฎ์ ์ฑ์ ๊ตฌํํ๊ณ ์ถ์๋ค. ๋คํํ๋ ํ์ ์ค ํ ๋ถ์ด ํด๋ฆฐ ์ํคํ
์ณ์ ๋ํด ์ ์๊ณ ๊ณ์
์ ๋์์ ๋ง์ด ๋ฐ์๊ณ , ์ ๋ณด๋ค๋ ์ด๋์ ๋ ์์ฑ๋ ์ฑ์ ๋ง..
๐ป ๊ฐ๋ฐ/iOS
23.01.13 - ์ฑ์ ์ฒ์ ์ค์นํ์ ๋ ํ์ฌ ์์น๋ก ์ด๋ํ์ง ์๋ ์ค๋ฅ ํด๊ฒฐ ์ง๋ ๋ฒ ํ๋กํ ํ์
์ ์ด์ด ์ด๋ฒ ์ฃผ๋ถํฐ๋ MVP๋ฅผ ์งํํ๊ณ ์๋ค. ๊ธฐ์กด์ ๋๋ฏธ ๋ฐ์ดํฐ๋ก ๊ตฌํํ๋ ๊ฒ๋ค์ ์ค์ FireStore์ ์ฐ๋ํ๊ณ ๊ตฌํํ์ง ๋ชปํ๋ ๋ถ๋ถ๋ค์ ๊ตฌํํ๋ ๊ฒ์ ๋ชฉํ๋ก ์ก์๋ค. ์ด๋ฒ ์ฃผ์ ๊ตฌํํ๋ ค๋ ๊ธฐ๋ฅ์ ์๋์ ๊ฐ๋ค. 1. ์ฌ์ฉ์๊ฐ ์ง๋๋ฅผ ์์ง์ด๋ฉด ์์ง์ธ ์ขํ์ ๋ํ ๋๋ก๋ช
์ฃผ์๋ฅผ ์ค์๊ฐ์ ๊ฐ์ ธ์ด 2. ์ฌ์ฉ์๊ฐ ์ง๋๋ฅผ ์์ง์ด๋ฉด ๋ง์ปค๊ฐ ์ด์ง ์๋ก ์ฌ๋ผ๊ฐ๊ณ , ์์ง์์ด ๋ฉ์ถ๋ฉด ๋ง์ปค๊ฐ ๋ค์ ๋ด๋ ค์ด 3. ์ฌ์ฉ์์ ํ์ฌ ์์น๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํ์ฌ ์์น๋ก ์ง๋์ Focus๋ฅผ ๋ณ๊ฒฝํจ ํ๋์ฉ ์ดํด๋ณด๋๋ก ํ์. 1. ์ฌ์ฉ์๊ฐ ์ง๋๋ฅผ ์์ง์ด๋ฉด ์์ง์ธ ์ขํ์ ๋ํ ๋๋ก๋ช
์ฃผ์๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ๋ง์ด ์ข ๊ธธ๋ค. ๊ฐ..
๐ป ๊ฐ๋ฐ/iOS
SwiftUI๋ก ๊ฐ๋ฐ์ ์งํํ๋ค๊ฐ View ๋ด๋ถ์์ ์ง์ ์ ์ผ๋ก ํ๋กํผํฐ์ ์ ๊ทผํ ๋ onAppear๋ฅผ ํ ๋ฒ์ฏค์ ์ฌ์ฉํ ๊ฒฝํ์ด ์์ ๊ฒ์ด๋ค. ๊ฐ๋ น, print(ํ๋กํผํฐ)์ฒ๋ผ View ๋ด๋ถ์์ ์ ๊ทผํ๋ฉด ์ด๋ฐ ์๋ฌ๊ฐ ๋ฌ๋ค. View๋ฅผ ๋ฐํํด๋ฌ๋ผ๋ ์๋ฌ๋ค. ์ด๋ฐ ์๋ฌ์ ๋ง์ฃผ์น์ง ์๊ธฐ ์ํด View ๋ด๋ถ์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ์ง ์๊ณ , onAppear ํด๋ก์ ๋ด๋ถ์์ ์ ๊ทผํ๋ ๋ฐฉ์์ ํํ๋ค. ์๋ฌดํผ ์ด๋ด ๋ ์์ฃผ ์ฌ์ฉํ๋ onAppear๋ SwiftUI View Life Cycle์ ์ํ๊ณ , ์ค๋์ Life Cycle์ ๋ํด ์์๋ณด๋ ค๊ณ ํ๋ค. SwiftUI์์ 3๊ฐ์ Life Cycle์ด ์๊ณ , ๊ฐ๊ฐ์ Appear, Update, Disappear ์ด๋ค. 1. onAppear onAppear์ View๊ฐ ๋ณด์ฌ์ง๊ธฐ..
๐ป ๊ฐ๋ฐ/์๋ฌ์์ ๋์นจ
22.11.21 json์ ์กด์ฌํ๋ key, value๋ฅผ struct์์ ์ ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ ์์ ์ผ๋ก Decoding ๋ฐ๋๋ก json์ ์กด์ฌํ์ง ์๋ key, value๋ฅผ struct์์ ์ ์ํ๋ ๊ฒฝ์ฐ์๋ KeyNotFound Error๊ฐ ๋ฐ์ ํน์ value์ key-value๊ฐ ๋ถ๋ถ์ ์ผ๋ก ์กด์ฌํ ๋๋ Optional์ ์ ์ฉ ๋ง์ฝ, key-value๋ฅผ ์ ๋๋ก ์ ์ํ๋๋ฐ KeyNotFound Error๊ฐ ๋ฐ์ํ๋ฉด ํน์ key-value๊ฐ ๋ถ๋ถ์ ์ผ๋ก ์กด์ฌํ๋์ง ํ์ธํ ๊ฒ 22.11.22 json์๋ id๊ฐ ์์ง๋ง identifiable์ ๋ง์กฑ์ํค๊ธฐ ์ํด uuid๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒฝ์ฐ var์ด ์๋ let์ผ๋ก ์ ์ธ EnvironmentObject๋ฅผ ์ฌ์ฉํ ๋, ์ต์๋จ์์ ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ์ ๋ทฐ์ ๊ฒ์ธต ๊ตฌ์กฐ..
๐ป ๊ฐ๋ฐ/iOS
์ค๋์ ScrollView์ LazyVStack์ ํ์ฉํ์ฌ SwiftUI์์ ๋ฌดํ ์คํฌ๋กค์ ๊ตฌํํด๋ณด๋ ค๊ณ ํ๋ค. ์ฌ์ค, LazyVStack์ด ์กฐ๊ธ ์์ํ ์ ์๋ค. LazyVStack์ ๋ง ๊ทธ๋๋ก Lazyํ๊ฒ VStack์ ๊ทธ๋ฆฐ๋ค๋ ๋๋์ผ๋ก, VStack์ผ๋ก ๋ณด์ฌ์ค ํญ๋ชฉ์ด ์ค์ ๋ก UI์ ๋ณด์ฌ์ง ๋ ๋ ๋๋ง์ ์งํํ๋ View์ด๋ค. Apple Developer Documentation developer.apple.com ๊ทธ๋ ๋ค๋ฉด ๊ธฐ์กด์ ์ฌ์ฉํ๋ VStack๊ณผ๋ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น? ํ์์ ์ฌ์ฉํ๋ VStack์ ๋ทฐ๊ฐ ๋ณด์ฌ์ง ๋(onAppear) ๋ชจ๋ ํญ๋ชฉ์ ๋ ๋๋งํ๋ค. ๊ทธ๋ ๊ธฐ์ ScrollView + VStack ์กฐํฉ์ผ๋ก List๋ฅผ ๋ํ๋ธ๋ค๋ฉด ์ด๊ธฐ์ ๋ง์ ๋ฆฌ์์ค๋ฅผ ์๋ชจํ๊ฒ ๋๋ค. ์ ์ ๊ฐ์์ ๊ฐ๋จํ ํญ๋ชฉ๋ค์ ..
๐ป ๊ฐ๋ฐ/iOS
Swift๋ก ๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด ์ค๋ฅ๋ฅผ ์์ฃผ ์ ํ๊ฒ ๋๋ค. (error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String) '์ด๊ฒ ์ ์๋จ? ใ
ใ
' ๋ผ๋ ์๊ฐ์ด ๋ค ์ ๋๋ก ์๋๋ค. ์๋ฌดํผ ์ด๋ฐ ์ค๋ฅ๋ฅผ ์์ฃผ ์ ํ๊ธฐ์ ๊ธ๋ก ์ ๋ฆฌํ๋ฉด์ ๋ค์ ํ ๋ฒ ๋ณต์ตํ๋ ค๊ณ ํ๋ค. 1. ๋ฌธ์์ด ํ ๋ณํํ๊ธฐ 1. String -> Int ๋ค๋ฅธ ์ธ์ด์์์ฒ๋ผ Int()๋ก ํ ๋ณํ์ ์งํํ๋ค. ์ด ๋, String์ธ์ง SubString์ธ์ง Character์ธ์ง ์ ์ดํด๋ณธ๋ค. (๊ทธ๋ ์ง ์์ผ๋ฉด... error: cannot convert value of type 'String.Element' (aka 'Chara..
๐ป ๊ฐ๋ฐ/iOS
State์ Binding ์ง๋ ์๊ฐ @State์ @Binding ํ๋กํผํฐ ๋ํผ์ ๋ํด ํ์ตํ๋ค. 1. @State @State ํ๋กํผํฐ ๋ํผ๋ฅผ ์ฌ์ฉํด์ ์ํ ํ๋กํผํฐ๋ฅผ ์์ฑํ๋ฉด ํด๋น ํ๋กํผํฐ๊ฐ ์ ์ธ๋ ๋ทฐ์ ๋ฐ์ธ๋ฉํ ์ ์๊ฒ ๋๋ค. ์ข ๋ ์ฝ๊ฒ ์ค๋ช
ํ์๋ฉด ๋ทฐ์ ๋ฐ์ธ๋ฉ์ด ๋์ด ์๋ ์ํํ๋กํผํฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์๋์ผ๋ก ๋ทฐ๊ฐ ๊ฐฑ์ ๋๋ค๋ ๋ง์ด๋ค. ์ฝ๋๋ก ์ง์ ์ดํด๋ณด์. ์๋ ์ฝ๋๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ซ์๊ฐ 1์ฉ ์ฆ๊ฐํ๋๋ก ๊ตฌํํ ์ฑ์ด๋ค. struct ContentView: View { @State private var number: Int = 0 var body: some View { VStack { Text("\(self.number)") Button(action: { self.number += 1 }) ..
๐ป ๊ฐ๋ฐ/iOS
SwiftUI Keyboard Dismiss ์ด์ ๊ตฌํํ ํ ๊ณผ์ ๋ฅผ ๋ค์ ํ ๋ฒ ๊ตฌํํ๋ ๋์ค์ ์ถ๊ฐํด๋ณด๊ณ ์ถ์ ๊ธฐ๋ฅ์ด ์์๋ค. ์ฌ์ฉ์ ์
๋ ฅ์ ์ํํธ ํค๋ณด๋ ํน์ ๋ฒํผ์ ํตํด์ ์
๋ ฅ ๋ฐ๋๋ฐ, ์ํํธ ํค๋ณด๋๋ก ์
๋ ฅ ๋ฐ์ ๊ฒฝ์ฐ์ Submit์ ๋๋ฅด์ง ์๊ณ , ๋ทฐ์ ํด๋ฆญํ๋๋ผ๋ ์ํํธ ํค๋ณด๋๊ฐ ๋ซํ๋๋ก ๊ตฌํํ๊ณ ์ถ์๋ค. 1. Focused ์ฐ์ ์ด ๊ธฐ๋ฅ์ SwiftUI 3.0 (iOS 15) ์ด์๋ถํฐ ์ง์ํ๋ค. ๊ทธ๋ฐ ํ์ธ๊ฐ ์ ๋ง ๊ฐ๋จํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค. var body: some View { @State private var input: String = "" @FocusState private var isFocused: Bool // ์๋ต... VStack { TextField("PlaceHolder", $i..