๐ŸŽ SwiftUI์—์„œ @Observable์„ ์‚ฌ์šฉํ•˜์ž
ยท
๐Ÿง‘๐Ÿป‍๐Ÿ’ป Dev
์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„~! ์˜ค๋Š˜์€ iOS 17๋ถ€ํ„ฐ ๋„์ž…๋œ @Observable ๋งคํฌ๋กœ๊ฐ€ ๊ธฐ์กด์˜ ObservableObject๋ฅผ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ด…์‹œ๋‹ค! ๐Ÿ‘€์˜ˆ์ „์—๋Š” ์ด๋žฌ์–ด์š”... ObservableObject + @PublishediOS 13๋ถ€ํ„ฐ SwiftUI๊ฐ€ ์ฒ˜์Œ ๋‚˜์™”์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•ด ObservableObject ํ”„๋กœํ† ์ฝœ๊ณผ @Published ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ–ˆ์–ด์š”. ์ด๊ฑฐ ์จ๋ณธ ์‚ฌ๋žŒ? ์†! โœ‹class UserProfile: ObservableObject { @Published var username: String = "์• ํ”Œ๋น " @Published var level: Int = 1 @Published var isOnline: Bool = false}..
SwiftUI Spacer ์‚ฌ์šฉ ๊ฟ€ํŒ
ยท
๐Ÿง‘๐Ÿป‍๐Ÿ’ป Dev
SwiftUI์—์„œ ์ด๋Ÿฐ ๋ ˆ์ด์•„์›ƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ๊นŒ? "๊ณ ์–‘์ด" ํ…์ŠคํŠธ ๊ธธ์ด๋Š” ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š”๋ฐ ์ค‘์•™์— ์™€์•ผํ•˜๊ณ  ์ง๊ฟ์€ ๊ทธ ์˜†์— ๋‚˜์™€์•ผ ํ•˜๋Š” ์ƒํ™ฉ.HStack ์œผ๋กœ ๋งŒ๋“ค๋ฉด ๊ณ ์–‘์ด์™€ ์ง๊ฟ์˜ ๋„“์ด๊ฐ€ ํ•ฉ์ณ์ง„ ์ฑ„ ์ค‘์•™์œผ๋กœ ์ •๋ ฌ๋˜์„œ "๊ณ ์–‘์ด"๋งŒ ๋”ฑ ์ค‘์•™์— ์ •๋ ฌ์ด ์•ˆ๋œ๋‹ค.ZStack ์— ๋„ฃ์ž๋‹ˆ ํ…์ŠคํŠธ ๊ธธ์ด๋„ ์•Œ์•„๋‚ด์•ผํ•  ๊ฒƒ ๊ฐ™๊ณ  ๋ณต์žกํ•ด์ง„๋‹ค.์ด๋Ÿด ๋•Œ Spacer ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹๋‹ค.HStack { Spacer() Text("๊ณ ์–‘์ด") Spacer() .overlay(alignment: .leading) { Text("์ง๊ฟ") .padding(.leading, 6) }}
Swift Concurrency์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ฃผ์˜ํ•˜๊ธฐ ๐Ÿง
ยท
๐Ÿง‘๐Ÿป‍๐Ÿ’ป Dev
์•ˆ๋…•ํ•˜์„ธ์š”~ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊ฒŒ์š”! ์ด๊ฑฐ ์ง„์งœ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ๋ฐ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋†“์น˜๋Š” ํ•จ์ •์ด์—์š” ใ…‹ใ…‹Task์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๊ด€๊ณ„ ๐Ÿ’ฆTask๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ, ๋ฌธ์ œ๋Š” Task๊ฐ€ ๊ฐ•ํ•œ ์ฐธ์กฐ(strong reference)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์ด์—์š”. ๋งŒ์•ฝ ํด๋กœ์ € ๋‚ด์—์„œ self๋ฅผ ์บก์ฒ˜ํ•˜๋ฉด ๋ทฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ ธ๋„ Task๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์š”!func loadData() { Task { // ์—ฌ๊ธฐ์„œ self๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์บก์ฒ˜ํ•จ let data = await self.fetchSomething() self.processData(data) // ๋งŒ์•ฝ Task๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”๋ฐ ๊ฐ์ฒด๊ฐ€ ํ•ด์ œ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด? ..
Swift Concurrency: async/await ์™„์ „์ •๋ณต ๐Ÿš€
ยท
๐Ÿง‘๐Ÿป‍๐Ÿ’ป Dev
์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ Swift Concurrency์˜ ํ•ต์‹ฌ์ธ async/await์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฒŒ์š”~ ๐Ÿ˜Š์™œ async/await๊ฐ€ ํ•„์š”ํ•œ ๊ฑฐ์ž„? ๐Ÿค”๊ธฐ์กด์— ์šฐ๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•  ๋•Œ๋Š” completion handler๋ฅผ ์‚ฌ์šฉํ–ˆ์ž–์•„์š”. ๊ทผ๋ฐ ์ด๊ฑฐ ์ง„์งœ ์ง€์˜ฅ์ด์—ˆ์Œใ…‹ใ…‹ ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ผ๊ณ ๋„ ํ•˜์ฃ . ์ฝ”๋“œ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋จ:func fetchUserData(completion: @escaping (User?) -> Void) { fetchUserID { id in fetchUserProfile(id: id) { profile in fetchUserPosts(profile: profile) { posts in let user = User(id: id..