iOS ๐ŸŽ

์ฐธ๊ณ  ์‚ฌ์ดํŠธ https://axiomatic-fuschia-666.notion.site/Chapter-1-Hello-TCA-70c56437681547d4b85cd1363a157356 Chapter 1. Hello, TCA ์•ˆ๋…•ํ•˜์„ธ์š”. Swift๋กœ Apple ์ƒํƒœ๊ณ„ ๊ฐœ๋ฐœ์— ์ผ์กฐํ•ด ์ฃผ์‹œ๋Š” ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„, ๋ชจ๋‘ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค! axiomatic-fuschia-666.notion.site https://www.pointfree.co/collections/tours/composable-architecture-1-0/ep243-tour-of-the-composable-architecture-1-0-the-basics Episode #243: Tour of the Composable Architecture: The Ba..
์ด์ „์— ์–ด๋Š ์„œ๋น„์Šค์—์„œ๋„ ๊ทธ๋žฌ์ง€๋งŒ ๊ฐ€์ž…์‹œ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์„œ๋ฅ˜ ์ค‘ ์ˆ˜๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒˆ ์„œ๋น„์Šค ๋˜ํ•œ ์ตœ๋Œ€ 5๊ฐœ์˜ ์„œ๋ฅ˜๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๊ณ , ๊ทธ ์„œ๋ฅ˜๊ฐ€ ์œ ํšจํ•œ์ง€ ์ˆ˜๊ธฐ๋กœ ๊ฒ€์ฆ ํ›„์— ๊ฐ€์ž…์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ฒจ๋ถ€ ํ›„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณ„๋„๋กœ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ฒจ๋ถ€๋จ- ์ƒํƒœ ํ‘œ์‹œ ํ›„ ๋์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ํ„ฐ์น˜ ํ•œ๋ฒˆ ์ž˜ ๋ชป ํ•ด์„œ ์ด์ƒํ•œ ์‚ฌ์ง„์ด ๋“ค์–ด๊ฐ€๋ฉด ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ์ด ํ›„ CS์—์„œ๋Š” ์‚ฌ์šฉ์ž์™€ ์—ฐ๋ฝํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. ์™„์ „ํžˆ VisionKit์—๊ฒŒ ๋งก๊ธฐ๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ์ด๊ฒ ์ง€๋งŒ, ๊ธ€์ž๋ฅผ ์ถ”์ถœํ•ด์„œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์„œ๋ฅ˜๋Š” ์–ผ๋Ÿฟ ์ฐฝ ํ•œ๋ฒˆ ๋„์›Œ์„œ ์ธ์‹ ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. CS ํŒ€ ์—…๋ฌด๋ฅผ ์กฐ๊ธˆ ์ค„์—ฌ๋“ค์ผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?! ์• ํ”Œ์—์„œ ์ง€์›ํ•˜๋Š” VisionKit์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์ธ์‹..
์•„๋ฌด๋ฆฌ ๋ด๋„ ํƒญ ๋ฐ”๊ฐ€ ๋งž๋Š”๊ฑฐ ๊ฐ™์€๋ฐ ๋””์ž์ธํŒ€์ด ํ† ๊ธ€์ด๋ผ ํ•˜๋‹ˆ ์šฐ์„  ํ† ๊ธ€์ธ๊ฑธ๋กœ..!! ๋ญ 2๊ฐœ๋ฉด ํ† ๊ธ€ ๋งž์ง€! ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๋ช‡ ๊ฐœ๊ฐ€ ์˜ฌ์ง€ ๋ชจ๋ฅด๊ณ , ํ•ด๋‹น ์˜์—ญ์„ ํƒญํ–ˆ์„ ๋•Œ ํ† ๊ธ€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹คํ–‰๋˜์•ผ ํ•œ๋‹ค. Namespace๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  animation ์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค! ์ฒ˜์Œ์— GeometryReader๋กœ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐ ํ•œ ๋’ค ํ•˜๋‚˜์˜ View์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด ์ฃผ์—ˆ๋”๋‹ˆ offset๊ณผ padding ์œผ๋กœ ๋ทฐ ๊ณ„์ธต์„ ๋ฐ”๊ฟจ์„ ๋•Œ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค. GeometryReader๋กœ ๊ณ„์‚ฐ ํ•œ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ ์—‰๋šฑํ•œ ๊ณณ์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์›€์ง์˜€๋‹ค. struct CustomToggle: View { let priceList = ["on", "off", "test"] /// ํ† ๊ธ€ ..
struct TipBubbleShape: Shape, InsettableShape { private var insetValue = 0.0 func inset(by amount: CGFloat) -> some InsettableShape { var bubble = self bubble.insetValue = amount return bubble } func path(in rect: CGRect) -> Path { let width = rect.width let height = rect.height let radius = rect.height / 2.0 let midpoint = radius * 0.42 let path = Path { p in p.move(to: CGPoint(x: 25, y: height..
2023.10 ๊ธฐ์ค€ SwiftUI์—์„œ life cycle updates modifier๋กœ ์ง€์ •๋œ ๊ฒƒ์€ 4๊ฐœ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋งˆ์ง€๋ง‰ task๋Š” task๋งŒ ๋”ฐ๋กœ ํ•œ๋ฒˆ ํŒŒ๋ณด๊ธฐ๋กœ ํ•˜๊ณ  onAppear, onDisappear, task ์•Œ์•„๋ด…์‹œ๋‹ค ๋‹ค ๋“œ๋ฃจ์™€~ SwiftUI์—์„œ ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. UIKit์—์„œ ViewController๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ํ™”๋ฉด ์ „ํ™˜๋˜๋Š” View๋ฅผ ViewController๋กœ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ SwiftUI ์—์„œ๋Š” view๋ผ๋Š” ๋‹จ์œ„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๊ธฐ ๋ณด๋‹ค๋Š” View๊ฐ€ View๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ View์˜ ์ผ๋ถ€๋ถ„์ด ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ณ ๋ คํ•ด์„œ ์•Œ์•„๋ด์•ผ ํ•œ๋‹ค. ์šฐ์„  ๊ฐ modifire์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด onAppear func o..
* advanced๊ฐ€ ๊ธ€ ์•ž์— ๋ถ™์œผ๋ฉด ์ด๋ก  + ์‹ค์ „์‘์šฉ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค~ Environment์™€ keypath๋ฅผ ํ†ตํ•ด์„œ SwiftUI์—์„œ ๋ฏธ๋ฆฌ ์ง€์ •๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. @Environment(\.layoutDirection) var layoutDirection @Environment(\.dismiss) var dismiss ๊ฐ๊ฐ View์˜ ๋ฐฉํ–ฅ, ๋ทฐ๋ฅผ dismiss ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์„ Environment ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ํ†ตํ•ด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ ์ง์ ‘ ์ปค์Šคํ…€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. Environment์™€ EnvironmentObject๋Š” ์—ฌ๋Ÿฌ View์— ๊ฑธ์ณ์„œ ์‚ฌ์šฉํ•  ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ค๋Š˜์€ ๊ทธ ์ค‘์—์„œ Environment ์•Œ์•„๋ณด๊ธฐ! Environment Values Environmen..
predicates๋Š” ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ์ˆ ์–ด๋ผ๊ณ  ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ๋…ผ๋ฆฌ์ ์ธ ์กฐ๊ฑด์‹์„ ์˜๋ฏธํ•จ. SwiftData๋Š” predicates๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋…ผ๋ฆฌ์  ์กฐ๊ฑด์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. SwiftData์˜ Schema๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Model์„ ๊ตฌ์„ฑํ•  ๋•Œ enum ์ด๋‚˜ image ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ. Relationship ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ˜ผ์ž ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋Š” ์—†๊ณ , ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ทธ ๊ด€๊ณ„๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ๋‹ค:๋‹ค ๊ด€๊ณ„ A๋ผ๋Š” ๋ชจ๋ธ์ด B๋ชจ๋ธ์„ ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , B๋ผ๋Š” ๋ชจ๋ธ์ด A๋ผ๋Š” ๋ชจ๋ธ์„ ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„๋•Œ ๋‹ค:๋‹ค ๊ด€๊ณ„๋ผ๊ณ  ํ•œ๋‹ค. /// ์œ ์ € ์ •๋ณด @Model class ..
๋ฆฌ์ŠคํŠธ๋Š” ์„œ๋น„์Šค ๋˜๊ณ  ์žˆ๋Š” ์•ฑ์—์„œ ๋น ์ง€์ง€ ์•Š๊ณ  ๋“ฑ์žฅํ•˜๋Š” UI ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ผ๋ถ€๋งŒ ๊ฐ€์ ธ์˜จ ๋’ค ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ์ผ๋ถ€๋ฅผ ๋‹ค ๋ณด๋ฉด ์ƒˆ๋กœ์šด ๋ชฉ๋ก์„ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ load more ํ˜น์€ infinite scroll ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. SwiftUI์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ View๋“ค์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘์— VStack์€ ์•„์ดํ…œ๋“ค์„ ์„ธ๋กœ ๋ฐฉํ–ฅ์œผ๋กœ ์Œ“์Šต๋‹ˆ๋‹ค. ์ด VStack์ด ScrollView์™€ ๋งŒ๋‚˜๋ฉด ์ €ํฌ๊ฐ€ UIKit์—์„œ ๋ณด์•˜๋˜ UITableView ํ˜น์€ UICollectionView์™€ ๋™์ผํ•œ UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— LazyVStack์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค! ๊ฐ์ž ์–ด๋””์— ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ์š”? ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ ๋™์ž‘ํ•˜๋Š” ..
fram
'iOS ๐ŸŽ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (3 Page)