๐Ÿ’ป ๊ฐœ๋ฐœ/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์˜ ๋™์ž‘ ๊ณผ์ • ์ฝ”๋“œ๋กœ๋Š” ์ด๋ ‡๊ฒŒ..

๐Ÿ’ป ๊ฐœ๋ฐœ/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๊ฐ€ ๋ณด์—ฌ์ง€๊ธฐ..

๐Ÿ’ป ๊ฐœ๋ฐœ/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๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ์ดˆ๊ธฐ์— ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค. ์ ์€ ๊ฐœ์ˆ˜์˜ ๊ฐ„๋‹จํ•œ ํ•ญ๋ชฉ๋“ค์„ ..

๐Ÿ’ป ๊ฐœ๋ฐœ/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 }) ..

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

[iOS / SwiftUI] ํ‚ค๋ณด๋“œ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•„์š”...๐Ÿ˜ฉ

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

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

[iOS / SwiftUI] ForEach๋กœ View๋ฅผ ๋ฆฌํŽ™ํ† ๋ง ํ•ด๋ณผ๊นŒ์š”?

Swift UI์—์„œ ForEach๋กœ View ์—ฌ๋Ÿฌ ๊ฐœ ์˜ค๋Š˜ ์Šคํ„ฐ๋””์—์„œ ๋‚ ์”จ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€๋ฅผ Swift UI๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. HStack๊ณผ VStack์„ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ์˜€๊ณ  ๊ตฌํ˜„ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•˜๊ณ  ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„์ด ํ•˜๋“œ ์ฝ”๋”ฉ๋˜์–ด ์žˆ์–ด์„œ ๊ฒน์น˜๋Š” ์ฝ”๋“œ๋“ค์ด ๋งŽ์•„ ์ด๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋นจ๊ฐ„์ƒ‰ ๋ทฐ ์•ˆ์— ์ดˆ๋ก์ƒ‰ ๋ทฐ๋“ค์ด ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด์—๋Š” HStack ๋‚ด๋ถ€์— VStack์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ ForEach๋ฅผ ํ™œ์šฉํ•ด์„œ VStack์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค. 1. ๊ธฐ์กด ์ฝ”๋“œ struct DailyHourWeatherView: View { var body: some View { HS..

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

[iOS / Swift] lim ํด๋กœ์ € -> 0 (ํด๋กœ์ €, ๊ทนํ•œ์œผ๋กœ ์ค„์—ฌ๋ณด๊ธฐ)

์ง€๋‚œ ์‹œ๊ฐ„์— ๊ฐœ์ธ์ ์œผ๋กœ ํด๋กœ์ €์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ์•Œ์•„๋ดค๋Š”๋ฐ ์˜ค๋Š˜ ๊ฐ•์˜์—์„œ๋Š” ํด๋กœ์ €์— ๋Œ€ํ•œ ์ง„๋„๋ฅผ ๋‚˜๊ฐ”๋‹ค. ๋ณต์Šต ์ฐจ์›์—์„œ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ดค๋‹ค. ํด๋กœ์ € ํด๋กœ์ €๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด๋‹ค. ํด๋กœ์ €์—์„œ๋Š” ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์บก์ณํ•˜๊ณ  ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์ „์—ญ ํ•จ์ˆ˜ ์ค‘์ฒฉ ํ•จ์ˆ˜ ํด๋กœ์ € ํ‘œํ˜„์‹ 1. ์ „์—ญ ํ•จ์ˆ˜ ์ฒซ ๋ฒˆ์งธ๋กœ ์ „์—ญํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด์„œ ์ •์˜ํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค. func ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ •์˜ํ•œ๋‹ค. ์ „์—ญํ•จ์ˆ˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์–ด๋– ํ•œ ๊ฐ’๋„ ์บก์ณํ•˜์ง€ ์•Š๋Š” ํด๋กœ์ €์ด๋‹ค. func justFunction() -> String { return "KODO" } 2. ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋‘ ๋ฒˆ์งธ๋กœ ์ค‘์ฒฉ ํ•จ์ˆ˜๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ๋‘˜๋Ÿฌ์‹ผ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์บก์ณํ•  ์ˆ˜ ์žˆ๋Š”..

kodo_o
'๐Ÿ’ป ๊ฐœ๋ฐœ/iOS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก