์ „์ฒด ๊ธ€

iOS ๊ฟ€์žผ!
๐Ÿ’ป ๊ฐœ๋ฐœ/iOS

[iOS / SwiftUI] .mask๋ฅผ ํ™œ์šฉํ•˜์—ฌ Custom ProgressView๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž

์ง€๊ธˆ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜๊ณ  ์žˆ๋‹ค. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋””์ž์ธ์ด ๊ตฌ์ƒ์ด ๋˜์–ด ์žˆ์–ด์„œ, ์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ์ƒํ™ฉ์ด์—ˆ์ง€๋งŒ ProgressView๋Š” ๋ช…์‹œ๋œ ๋””์ž์ธ์ด ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€, ์•ฑ์˜ Identity์™€ UX๋ผ๋Š” ๋‘ ๋งˆ๋ฆฌ์˜ ํ† ๋ผ๋ฅผ ๋ชจ๋‘ ์žก์•„๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด, ์šฐ๋ฆฌ ์•ฑ์˜ ๋กœ๊ณ ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ ๋กœ๊ณ ๋งŒ ๋„์–ด์ฃผ๊ธฐ์—” ์ด์˜์ง€๋„ ์•Š๊ณ , ์ผ๋‹จ UX์ ์œผ๋กœ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜๋‹ค. Why? ๐Ÿง ProgressView๋Š” ์–ด๋– ํ•œ ์š”์ฒญ(ex, API Request)์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€์˜ ๋กœ๋”ฉ์„ ์‹œ์ž‘์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ๋‹จ์ˆœํžˆ ๋กœ๊ณ ๋งŒ ๋ก ๋„์–ด๋†“์œผ๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ด๊ฒŒ ๋ฌด์Šจ ์ƒํ™ฉ์ธ์ง€ ์ „ํ˜€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ Dynamicํ•œ ์š”์†Œ๊ฐ€ ํ•„์š”ํ–ˆ๋Š”..

๐Ÿ’ป ๊ฐœ๋ฐœ/iOS

[iOS / SwiftUI] View Memory Graph Hierarchy๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž

๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ iOS ์•ฑ ์Šค์ฟจ์—์„œ ์ตœ์ข… ํ”„๋กœ์ ํŠธ๋กœ ๋‹จ์–ด์žฅ ์•ฑ์„ ๋งŒ๋“ค๋ฉด์„œ, AVSpeechSynthesizer๋ฅผ ํ™œ์šฉํ•˜์—ฌ TTS ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌํ˜„ ๊ณผ์ •์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ? ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚ฌ๊ณ  ์ƒ๊ฐ๋ณด๋‹ค ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ์˜€๋‹ค. ์ฝ”๋“œ ์ƒ์œผ๋กœ๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ ๋ง์ด๋‹ค. (์ง„์งœ๋กœ? ๋ฌธ์ œ ์—†๋Š” ๊ฑฐ ๋งž์•„?) ๊ทธ๋ ‡๊ฒŒ ๊ณ ๋ฏผํ•˜๋˜ ์ค‘, ๊ฒฐ๊ตญ View Memory Graph Hierarchy๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ ์จ๋ดค๋Š”๋ฐ ์ •๋ง ์œ ์šฉํ•œ ์นœ๊ตฌ๋ผ๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค. ์•„๋ฌดํŠผ ์˜ค๋Š˜์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ์ด์Šˆ๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ์œ ์šฉํ•œ ์นœ๊ตฌ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ทธ ์ „์—, AVSpeechSynthesizer๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. AVSpeechSynthesizer์˜ ๋™์ž‘ ๊ณผ์ • ์ฝ”๋“œ๋กœ๋Š” ์ด๋ ‡๊ฒŒ..

๐Ÿ’ป ๊ฐœ๋ฐœ/Architecture

[Architecture] MVVM + Clean Architecture๋ฅผ ์•Œ์•„๋ณด์ž

SwiftUI์—์„œ๋Š” @ObservableObject ๋•๋ถ„์— ViewModel(์—ญํ• ์„ ํ•˜๋Š”?)์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋•๋ถ„์— ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ViewModel๋กœ ๋ถ„๋ฆฌ๋Š” ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค. ์ผ๋‹จ SwiftUI๊ฐ€ View ์ž์ฒด์ ์œผ๋กœ Data Binding์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ViewModel์ด ๋…น์•„๋“ค์–ด๊ฐ„ ๋Š๋‚Œ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋ณด๋‹ค๋„ ํ•˜๋‚˜์˜ ViewModel์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋‹ˆ Massive ViewModel์ด๋ž„๊นŒ? ViewModel์ด ๋น„๋Œ€ํ•ด์ง„ ๋Š๋‚Œ์ด ๋“ค์—ˆ๊ณ , ๊ทธ๋ž˜์„œ ํ•ด์ปคํ†ค ๋•Œ๋Š” ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๊ฑท์–ด๋‚ด๊ณ  ์•„ํ‚คํ…์ณ์ ์œผ๋กœ ์กฐ๊ธˆ ๋” ๊ดœ์ฐฎ์€ ์•ฑ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ํŒ€์› ์ค‘ ํ•œ ๋ถ„์ด ํด๋ฆฐ ์•„ํ‚คํ…์ณ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ๊ณ„์…”์„œ ๋„์›€์„ ๋งŽ์ด ๋ฐ›์•˜๊ณ , ์ „๋ณด๋‹ค๋Š” ์–ด๋Š์ •๋„ ์™„์„ฑ๋œ ์•ฑ์„ ๋งŒ..

๐Ÿ’ป ๊ฐœ๋ฐœ/iOS

[iOS / SwiftUI] MapKit, ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋„๋กœ๋ช… ์ฃผ์†Œ ๋ณ€ํ™˜ํ•˜๊ธฐ

23.01.13 - ์•ฑ์„ ์ฒ˜์Œ ์„ค์น˜ํ–ˆ์„ ๋•Œ ํ˜„์žฌ ์œ„์น˜๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ์ง€๋‚œ ๋ฒˆ ํ”„๋กœํ† ํƒ€์ž…์— ์ด์–ด ์ด๋ฒˆ ์ฃผ๋ถ€ํ„ฐ๋Š” MVP๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ๊ธฐ์กด์— ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์‹ค์ œ FireStore์™€ ์—ฐ๋™ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์žก์•˜๋‹ค. ์ด๋ฒˆ ์ฃผ์— ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 1. ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์›€์ง์ด๋ฉด ์›€์ง์ธ ์ขŒํ‘œ์— ๋Œ€ํ•œ ๋„๋กœ๋ช… ์ฃผ์†Œ๋ฅผ ์‹ค์‹œ๊ฐ„์„ ๊ฐ€์ ธ์˜ด 2. ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์›€์ง์ด๋ฉด ๋งˆ์ปค๊ฐ€ ์‚ด์ง ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ , ์›€์ง์ž„์ด ๋ฉˆ์ถ”๋ฉด ๋งˆ์ปค๊ฐ€ ๋‹ค์‹œ ๋‚ด๋ ค์˜ด 3. ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜๋กœ ์ง€๋„์˜ Focus๋ฅผ ๋ณ€๊ฒฝํ•จ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. 1. ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„๋ฅผ ์›€์ง์ด๋ฉด ์›€์ง์ธ ์ขŒํ‘œ์— ๋Œ€ํ•œ ๋„๋กœ๋ช… ์ฃผ์†Œ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ง์ด ์ข€ ๊ธธ๋‹ค. ๊ฐ„..

๐Ÿ’ป ๊ฐœ๋ฐœ/iOS

[iOS / SwiftUI] OnAppear, OnDisappear๋Š” ์–ธ์ œ ํ˜ธ์ถœ๋ ๊นŒ?

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์›” 4์ฃผ์ฐจ

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

[iOS / SwiftUI] ์Šคํฌ๋กค, ๋ฌดํ•œ์œผ๋กœ ์ฆ๊ฒจ์š”~ (LazyVStack์œผ๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„ํ•˜๊ธฐ)

์˜ค๋Š˜์€ ScrollView์™€ LazyVStack์„ ํ™œ์šฉํ•˜์—ฌ SwiftUI์—์„œ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์‹ค, LazyVStack์ด ์กฐ๊ธˆ ์ƒ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. LazyVStack์€ ๋ง ๊ทธ๋Œ€๋กœ Lazyํ•˜๊ฒŒ VStack์„ ๊ทธ๋ฆฐ๋‹ค๋Š” ๋Š๋‚Œ์œผ๋กœ, VStack์œผ๋กœ ๋ณด์—ฌ์ค„ ํ•ญ๋ชฉ์ด ์‹ค์ œ๋กœ UI์— ๋ณด์—ฌ์งˆ ๋•Œ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•˜๋Š” View์ด๋‹ค. Apple Developer Documentation developer.apple.com ๊ทธ๋ ‡๋‹ค๋ฉด ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ VStack๊ณผ๋Š” ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ? ํ‰์†Œ์— ์‚ฌ์šฉํ•˜๋˜ VStack์€ ๋ทฐ๊ฐ€ ๋ณด์—ฌ์งˆ ๋•Œ(onAppear) ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ScrollView + VStack ์กฐํ•ฉ์œผ๋กœ List๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ์ดˆ๊ธฐ์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค. ์ ์€ ๊ฐœ์ˆ˜์˜ ๊ฐ„๋‹จํ•œ ํ•ญ๋ชฉ๋“ค์„ ..

โ›น๏ธ ๋ผ์ดํ”„/ํšŒ๊ณ 

"let us: Go! 2022 Fall"์— ๋‹ค๋…€์™”์Šต๋‹ˆ๋‹ค!

๋‘๊ทผ๋‘๊ทผ ๋ ›์–ด์Šค๊ณ ! ๐Ÿ‘‹ ์ง€๋‚œ ์ฃผ์— ๋ ›์–ด์Šค๊ณ ์— ๋‹ค๋…€์™”๋‹ค. 11์›” 5์ผ์— ๋‹ค๋…€์™”์ง€๋งŒ! ์ง€๊ธˆ ํšŒ๊ณ ๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค. ์›๋ž˜ ํšŒ๊ณ ๋Š” ์ผ์ฃผ์ผ ๋’ค์— ์“ฐ๋Š”๊ฒŒ ๊ตญ๋ฃฐ! ๐Ÿ˜‹ ์šฐ์„  ๋ ›์–ด์Šค๊ณ ๋Š” ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ๋ฉ‹์‚ฌ ์•ฑ์Šค์ฟจ์—์„œ ํ•œ ๋ถ„์ด ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด์ฃผ์…”์„œ ์•Œ๊ฒŒ ๋๊ณ , ์šด ์ข‹๊ฒŒ ํ‹ฐ์ผ“ํŒ…์— ์„ฑ๊ณตํ•ด์„œ ์ฐธ๊ฐ€ํ•˜๊ฒŒ ๋๋‹ค. ํ‹ฐ์ผ“์€ ํ•™์ƒ ํ‹ฐ์ผ“๊ณผ ์ผ๋ฐ˜ ํ‹ฐ์ผ“์ด ์žˆ๋‹ค. ํ•™์ƒ ํ‹ฐ์ผ“์ด ํ›จ์”ฌ ์ €๋ ดํ•˜์ง€๋งŒ ์ˆ˜๋Ÿ‰์ด ์ ์–ด์„œ, ํ•™์ƒ ํ‹ฐ์ผ“ ์˜ˆ๋งค์—๋Š” ์‹คํŒจํ–ˆ๊ณ  ์ผ๋ฐ˜ ํ‹ฐ์ผ“์„ ์˜ˆ๋งคํ–ˆ๋‹ค! ๋ฒ„์Šค๋ฅผ ํƒ€๊ณ  ์„œ์šธ๊นŒ์ง€ ๊ฐ€์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ ์กฐ๊ธˆ ๊ณ ๋ฏผ์ด ๋งŽ์•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ iOS ์„ธ๋ฏธ๋‚˜๋ฅผ ์ฐธ๊ฐ€ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ์•„์นจ ์ผ์ฐ ์„œ์šธ์„ ํ–ฅํ–ˆ๋‹ค. ๋ฐœํ‘œ ์žฅ์†Œ๋Š” ์ฝ”์—‘์Šค ์•ž์— ์žˆ๋Š” Finda์˜€๋‹ค. 30๋ถ„ ์ •๋„ ์ผ์ฐ ๋„์ฐฉํ–ˆ๋”๋‹ˆ ์šด์˜์ง„์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฑฐ์˜ ์—†์—ˆ๋‹ค. ๋’ค์— ๊ณ„์‹  ๋ถ„๊ณผ ์–˜๊ธฐ๋ฅผ ๋‚˜๋ˆŒ๊นŒํ–ˆ์ง€๋งŒ ๊ฐ™์ด ์˜ค์‹  ๋ถ„์ด ์žˆ..

๐Ÿ’ป ๊ฐœ๋ฐœ/iOS

[iOS / Swift] Swift ๋ฌธ์ž์—ด ์ •๋ณตํ•˜๊ธฐ (aka 'Character')

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

[iOS / SwiftUI] ๋‹ค์–‘ํ•œ ์ƒํƒœ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์•Œ์•„๋ณด์ž!

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

kodo_o
๐ŸŽ๐Ÿ