ð» ê°ë°/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를 ëíë¸ë¤ë©´ ì´ê¸°ì ë§ì 리ìì¤ë¥¼ ì모íê² ëë¤. ì ì ê°ìì ê°ë¨í í목ë¤ì ..
â¹ï¸ ë¼ì´í/íê³
ëê·¼ëê·¼ ë ì´ì¤ê³ ! ð ì§ë 주ì ë ì´ì¤ê³ ì ë¤ë
ìë¤. 11ì 5ì¼ì ë¤ë
ìì§ë§! ì§ê¸ íê³ ë¥¼ ì°ê³ ìë¤. ìë íê³ ë ì¼ì£¼ì¼ ë¤ì ì°ëê² êµë£°! ð ì°ì ë ì´ì¤ê³ ë ì§ê¸ íê³ ìë ë©ì¬ ì±ì¤ì¿¨ìì í ë¶ì´ ì 보를 ê³µì í´ì£¼ì
ì ìê² ëê³ , ì´ ì¢ê² í°ì¼í
ì ì±ê³µí´ì ì°¸ê°íê² ëë¤. í°ì¼ì íì í°ì¼ê³¼ ì¼ë° í°ì¼ì´ ìë¤. íì í°ì¼ì´ í¨ì¬ ì ë ´íì§ë§ ìëì´ ì ì´ì, íì í°ì¼ ì매ìë ì¤í¨íê³ ì¼ë° í°ì¼ì ì매íë¤! ë²ì¤ë¥¼ íê³ ìì¸ê¹ì§ ê°ì¼íë ìí©ì´ë¼ ì¡°ê¸ ê³ ë¯¼ì´ ë§ìì§ë§, ê·¸ëë iOS ì¸ë¯¸ë를 ì°¸ê°í´ë³´ê³ ì¶ì´ì ì침 ì¼ì° ìì¸ì í¥íë¤. ë°í ì¥ìë ì½ìì¤ ìì ìë Findaìë¤. 30ë¶ ì ë ì¼ì° ëì°©íëë ì´ìì§ì ì ì¸íê³ ë ê±°ì ììë¤. ë¤ì ê³ì ë¶ê³¼ ì기를 ëëê¹íì§ë§ ê°ì´ ì¤ì ë¶ì´ ì..
ð» ê°ë°/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 }) ..