๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

iOS/WWDC

WWDC24) SwiftUI ํ•ต์‹ฌ ๊ธฐ๋Šฅ

๋ฐ˜์‘ํ˜•

 

โœ… SwiftUI ๊ธฐ์ดˆ - ํ•ต์‹ฌ ์š”์•ฝ

  1. SwiftUI๋ž€?
    • Apple์˜ ์„ ์–ธ์  UI ํ”„๋ ˆ์ž„์›Œํฌ.
    • iOS, macOS, watchOS, tvOS ๋“ฑ Apple ์ „ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ๋จ.
    • ์ตœ์‹  ์•ฑ๊ณผ ๊ธฐ๋ณธ ์•ฑ์—๋„ ์ ์ง„์ ์œผ๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ฑ„ํƒ ์ค‘.
  2. SwiftUI์˜ ์žฅ์ 
    • ์ ์€ ์ฝ”๋“œ๋กœ ๋ณต์žกํ•œ UI์™€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.
    • ํ”Œ๋žซํผ ๊ณ ์œ  ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต.
    • ํ”„๋กœํ† ํƒ€์ž… → ํ”„๋กœ๋•์…˜ ์ „ํ™˜์ด ๋น ๋ฅด๊ณ  ํšจ์œจ์ .
    • ์•ฑ์˜ ํ•ต์‹ฌ ๊ฐ€์น˜์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ.
  3. ์ ์ง„์  ์ฑ„ํƒ ๊ฐ€๋Šฅ
    • ์•ฑ ์ „์ฒด๋ฅผ SwiftUI๋กœ ๋งŒ๋“ค ํ•„์š” ์—†์Œ.
    • ๊ธฐ์กด UIKit/AppKit๊ณผ๋„ ํ†ตํ•ฉ ๊ฐ€๋Šฅํ•ด ์ ์ง„์ ์œผ๋กœ ๋„์ž… ๊ฐ€๋Šฅ.
  4. ํ•™์Šต ์šฉ์ด์„ฑ
    • ์œ„ ํŠน์„ฑ๋“ค ๋•๋ถ„์— ์ดˆ๋ณด์ž๋„ SwiftUI๋ฅผ ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Œ.
  5. ๋‚ด์šฉ ๊ตฌ์„ฑ ์˜ˆ๊ณ 
    • โ‘  SwiftUI ๋ทฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋ณธ ๊ตฌ์กฐ
    • โ‘ก ๋‚ด์žฅ ๊ธฐ๋Šฅ๊ณผ Apple ํ”Œ๋žซํผ์—์„œ์˜ ํ™œ์šฉ ์˜ˆ
    • โ‘ข ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ(Uikit ๋“ฑ)์™€์˜ ํ†ตํ•ฉ ๋Šฅ๋ ฅ

 

โœ… SwiftUI ๋ทฐ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์„ค๋ช… 

  1. ์•ฑ ๋ชฉํ‘œ
    • ๋ฐ˜๋ ค๋™๋ฌผ๊ณผ ๊ทธ๋“ค์˜ ์žฌ์ฃผ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์•ฑ์„ SwiftUI๋กœ ๋นŒ๋“œํ•  ์˜ˆ์ •
  2. ๋ทฐ(View)์˜ ์—ญํ• 
    • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ๋‹จ์œ„
    • ํ™”๋ฉด์˜ ๋ชจ๋“  ํ”ฝ์…€์€ ๋ทฐ๋ฅผ ํ†ตํ•ด ์ •์˜๋จ
    • SwiftUI ์ž‘์—…์˜ ํ•ต์‹ฌ ์š”์†Œ
  3. SwiftUI ๋ทฐ์˜ 3๊ฐ€์ง€ ํŠน์ง•
    • ์„ ์–ธ์ (Declarative): ๊ฒฐ๊ณผ๋ฅผ ์„ ์–ธํ•˜์—ฌ UI๋ฅผ ๊ตฌ์„ฑ
    • ๊ตฌ์„ฑ์ (Compositional): ๋ทฐ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋” ๋ณต์žกํ•œ UI ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
    • ์ƒํƒœ ์ค‘์‹ฌ(State-driven): ๋ฐ์ดํ„ฐ ์ƒํƒœ์— ๋”ฐ๋ผ UI ์ž๋™ ๊ฐฑ์‹ 

 

โœ… SwiftUI์˜ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ 

 

1. ์„ ์–ธ์  UI ๊ตฌ์„ฑ

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” UI๋ฅผ "์„ค๋ช…"ํ•˜๋ฉด SwiftUI๊ฐ€ ๊ทธ์— ๋งž๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•จ.
  • ํ…์ŠคํŠธ, SF Symbols ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€, ๋ฒ„ํŠผ ๋“ฑ ๋‹ค์–‘ํ•œ ์ปจํŠธ๋กค์„ ์†์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

2. ์˜ˆ์‹œ: ์ˆ˜ํ‰ ์Šคํƒ(HStack)

  • ์•„์ด์ฝ˜ + ์ œ๋ชฉ ์กฐํ•ฉ์˜ ๋ ˆ์ด๋ธ”(Label)์„ ๊ตฌ์„ฑ.
  • ์ŠคํŽ˜์ด์„œ(Spacer)์™€ ํ…์ŠคํŠธ ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ.
  • ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์€ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ๋ฆฌ์ŠคํŠธ(List) ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์—๋„ ์ ์šฉ ๊ฐ€๋Šฅ.

 

3. ๋™์  ๋ฆฌ์ŠคํŠธ ๊ตฌ์„ฑ

  • ๋ฐ˜๋ ค๋™๋ฌผ ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ๋ฐ˜๋ ค๋™๋ฌผ๋งˆ๋‹ค HStack์„ ์ƒ์„ฑ.
  • ๊ฐ ๋ฐ˜๋ ค๋™๋ฌผ์˜ ๊ณ ์œ  ์†์„ฑ(์˜ˆ: ์ด๋ฆ„ ๋“ฑ)์„ ํ™œ์šฉํ•˜์—ฌ ๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ.

 

์„ ์–ธํ˜• vs ๋ช…๋ นํ˜• 

- ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์„ค๋ช…ํ•˜๊ณ , ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋‹จ๊ณ„๋ณ„ ์ง€์‹œ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.

ex) ๋ช…๋ นํ˜• : ํ™ˆ๋Ÿฐ์„ ์น˜๋Š” ๋‹จ๊ณ„๋ฅผ ์ง€์‹œ > ์ด๋ฆฌ์™€, ๋ฐฐํŠธ ๋ฌผ์–ด, ํ™ˆ ํ”Œ๋ ˆ์ดํŠธ๋กœ ๊ฐ€ , ์„ ์–ธํ˜• : ํ™ˆ๋Ÿฐ์„ ์ณ์„œ ๋“์ ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ ์‹ถ๋‹ค. 

- ์„ ์–ธํ˜• ์ฝ”๋“œ๋Š” ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„ ๋Œ€์‹  ์˜ˆ์ƒ๋˜๋Š” ๊ฒฐ๊ณผ์— ์ง‘์ค‘

- ๋ช…๋ นํ˜• ์ฝ”๋“œ๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋‚˜ ๊ธฐ์กด์˜ ์„ ์–ธ์  ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์—†์„ ๋•Œ ์œ ์šฉ.

- SwiftUI๋Š” ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋ฉฐ, ์˜ˆ์‹œ๋กœ ๋ฒ„ํŠผ์€ ์„ ์–ธ์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๊ณ  ํƒญ ์‹œ ๋ช…๋ นํ˜• ์ฝ”๋“œ๋กœ ๋ชฉ๋ก์— ๋ฐ˜๋ ค๋™๋ฌผ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

- SwiftUI ๋ทฐ๋Š” ์ƒํƒœ ์„ค๋ช…์ด๋ฉฐ, ํด๋ž˜์Šค ๋Œ€์‹  ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

- ๋ทฐ๋Š” ์„ ์–ธ์  ์„ค๋ช…์ด๋ฏ€๋กœ ๋ทฐ ํ•˜๋‚˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด๋„ ์•ฑ ์„ฑ๋Šฅ์€ ์ €ํ•˜๋˜์ง€ ์•Š๋Š”๋‹ค

 

 

Compositional

hstack : container view > ๋ ˆ์ด์•„์›ƒ์„ ์œ„ํ•œ ๊ฒƒ, ํ•˜์œ„ ํ•ญ๋ชฉ์„ ์ˆ˜ํ‰ ์Šคํƒ์— ๋ฐฐ์น˜

- ViewBuilder ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ํ•˜์œ„ ํ•ญ๋ชฉ์„ ์„ ์–ธ 

- ViewBuilder ์ฝ˜ํ…์ธ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” HStack ์ดˆ๊ธฐํ™” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ. 

- ์Šค์œ ์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ทฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด

- compositional์€  view modifiers๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋˜ ๋‹ค๋ฅธ ์Šค์œ ์˜ ํŒจํ„ด์—์„œ ์ค‘์š”ํ•œ ์—ญํ• 

 

 

view modifiers๋Š” ๊ธฐ๋ณธ ๋ทฐ์— ์ˆ˜์ •์‚ฌํ•ญ์„ ์ ์šฉํ•˜๊ณ  ํ•ด๋‹น ๋ทฐ์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ : ์›์œผ๋กœ ์ž๋ฅด๊ธฐ, ๊ทธ๋ฆผ์ž ์ถ”๊ฐ€ , ๋…น์ƒ‰ํ…Œ๋‘๋ฆฌ ์˜ค๋ฒ„๋ ˆ์ด

 

 

 

- ๋ทฐ ๊ณ„์ธต์€ ์‚ฌ์šฉ์ž ์„ค์ • ๋ทฐ์™€ ๋ทฐ ํ•œ์ •์ž๋กœ ์บก์Аํ™”๋  ์ˆ˜ ์žˆ์Œ.

- custom view๋Š” View ํ”„๋กœํ† ์ฝœ ์ค€์ˆ˜, ์ž์‹ ์ด ๋‚˜ํƒ€๋‚ด๋Š” ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” body ์†์„ฑ ๊ฐ€์ง 

ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๊ตฌ์„ฑ์„ ๊ฐœ์ธ ๋ทฐ ์†์„ฑ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง

 

 

์›ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ row๋ทฐ๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•˜๊ณ  ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Œ.

 

custom views ๋Š” body๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ž…๋ ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ–‰์ด ๋‚˜ํƒ€๋‚ผ ๋ฐ˜๋ ค๋™๋ฌผ์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์Œ.

 

> ๋™์ผํ•œ ๋ทฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•ด์„œ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฐ˜๋ ค๋™๋ฌผ ์ •๋ณด ํ‘œ์‹œ

 

collection > foreach ๋ทฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌ,

ForEach : ์ปฌ๋ ‰์…˜์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•œ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ๋ทฐ๋ฅผ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ์ œ๊ณต.

section์œผ๋กœ ๊ตฌ์„ฑ๋œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ตฌ์„ฑ ์ƒ์„ฑ

 

 

view modifier๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งž์ถคํ™”. swipe action ์ถ”๊ฐ€

 

 

State-driven

: ์ƒํƒœ์ค‘์‹ฌ. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ทฐ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด SwiftUI๋Š” ์ž๋™์œผ๋กœ ์ƒ์šฉ๊ตฌ ๋ฐ ์—…๋ฐ์ดํŠธ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ UI๋ฅผ ์ตœ์‹ ์ƒํƒœ๋กœ ์œ ์ง€

 

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ํ‘œํ˜„์„ ์œ ์ง€. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋ทฐ ๊ฐ’์ด ์ƒ์„ฑ๋˜์–ด ์Šค์œ ์— ์ œ๊ณต๋จ. ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •
์—ฐ๊ฒฐ๋œ ๋ฐ˜๋ ค๋™๋ฌผ ๊ฐ์ฒด๊ฐ€ ์ˆ˜์ •๋˜๊ณ , hasAward๊ฐ€ true๋กœ ๋ณ€๊ฒฝ๋จ. row ๋ทฐ์™€ ๊ฐ™์ด ์ด ๋ฐ˜๋ ค๋™๋ฌผ์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ๋ทฐ๋ฅผ ์ถ”์ .

 

- pet์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์žˆ๊ณ , body์—๋Š” pet์ด ๋ณด์ƒ์„ ๋ฐ›์•˜๋Š”์ง€ ๋˜๋Š” ์ข…์†์„ฑ์ด ์„ค์ •๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํŒ๋….

- swiftui๋Š” ์—…๋ฐ์ดํŠธ๋œ pet์œผ๋กœ ์ด ๋ทฐ์˜ body๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœ

- ๋ณด์ƒ์„ ๋ฐ˜์˜ํ•˜๋Š” ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ > swiftui๋Š” ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถœ๋ ฅ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ™”๋ฉด์— ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œ

 

๋ทฐ๊ฐ€ body์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น ๋ทฐ์˜ ์ข…์†์„ฑ

- ์ด ๊ฒฝ์šฐ์—๋Š” ์•ฑ์—์„œ Observable pet class๋ฅผ ์ƒ์„ฑ.

- ๋ทฐ body์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ์†์„ฑ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์ƒ์„ฑ.

- ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋„๊ตฌ : State, Binding

 

State

๋ทฐ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ƒ์„ฑ

๋ทฐ ์†์„ฑ์„ @State๋กœ ํ‘œ์‹œํ•˜๋ฉด SwiftUI๋Š” ์ €์žฅ ๊ณต๊ฐ„์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ทฐ๊ฐ€ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ์ œ๊ณต 

 

Binding

๋‹ค๋ฅธ ๋ทฐ์˜ ์ƒํƒœ์— ๋Œ€ํ•œ ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ

 

 

๋ฐ˜๋ ค๋™๋ฌผ์˜ ์žฌ์ฃผ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ทฐ

State ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋“ฑ๊ธ‰์„ ์ถ”์ ํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ

SwiftUI๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž๋™์œผ๋กœ ์ด ์ƒํƒœ์˜ ๊ฐ’์„ ์œ ์ง€ -> 5

 

์ฆ๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฒ„ํŠผ์˜ ์ž‘์—…์ด ํ˜ธ์ถœ๋จ > ๋ทฐ์˜ ๋‚ด๋ถ€ state๊ฐ€ ์ฆ๊ฐ€ -> 6

 

SwiftUI๊ฐ€ ์ด ๋ณ€ํ™”๋ฅผ ์ธ์ง€ํ•˜๊ณ  RatingView์—์„œ ๋ณธ๋ฌธ์„ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ…์ŠคํŠธ ๊ฐ’์„ ๋ฐ˜ํ™˜ > ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด์— ์—…๋ฐ์ดํŠธ๋จ

 

 

์ƒํƒœ๋ณ€๊ฒฝ์„ withAnimatin์œผ๋กœ ๋ž˜ํ•‘ > ๊ฒฐ๊ณผ ๋ทฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ธฐ๋ณธ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ•จ๊ป˜ ์ ์šฉ๋จ

- ํ…์ŠคํŠธ์—” ๊ธฐ๋ณธ ํฌ๋กœ์Šค ํŽ˜์ด๋“œ ์ „ํ™˜ ํšจ๊ณผ > ์ „ํ™˜ ํšจ๊ณผ ๋งž์ถคํ™” ๊ฐ€๋Šฅ

์ˆซ์ž ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ์ „ํ™˜ ํšจ๊ณผ

 

-> state ๋ž‘ animation์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์ƒํ˜ธ์ž‘์šฉ์ด ํฌํ•จ๋œ ์บก์Аํ™”๋œ ๋ทฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋นŒ๋“œ.

 

gauge์™€ Ratingview๋ฅผ ๊ฒฐํ•ฉ > RatingContainerView

 

๊ฐ๊ฐ ๊ณ ์œ ํ•œ state๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋“ฑ๊ธ‰์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ •๋ณด ์†Œ์Šค ์—ญํ• 

 

RatingView์˜ ์ž์ฒด state๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ ๋ทฐ์˜ state์™€ gauge๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธ.

 

Binding์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ทฐ์—์„œ ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธ

> ์ปจํ…Œ์ด๋„ˆ ๋ทฐ state๊ฐ€ ์œ ์ผํ•œ ์ •๋ณด ์†Œ์Šค๊ฐ€ ๋˜๋ฉฐ guage์— ๊ฐ’์„ ์ œ๊ณตํ•˜๊ณ  ratingview์— binding์„ ์ œ๊ณต. 

 

 

๐Ÿ”‘ ํ•ต์‹ฌ ๊ฐœ๋… ์š”์•ฝ

โœ… @State

  • **์ƒํƒœ์˜ ์›๋ณธ(Source of Truth)**์ž…๋‹ˆ๋‹ค.
  • SwiftUI ๋ทฐ ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๊ฐ’ ๋ณ€๊ฒฝ ๊ถŒํ•œ์„ ๊ฐ€์ง.
  • ํ•ด๋‹น ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋ทฐ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ ค์ง.

โœ… @Binding

  • ์™ธ๋ถ€ ์ƒํƒœ์˜ ์ฐธ์กฐ์ž(Proxy) ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ์˜ ์›๋ณธ์„ ์ง์ ‘ ๊ฐ€์ง€์ง€ ์•Š๊ณ , ์™ธ๋ถ€์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ฝ๊ณ  ์“ฐ๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ–์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋…์œผ๋กœ ์ •๋ณด์˜ ๊ธฐ์ค€์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
struct RatingContainerView: View {
    @State private var rating: Int = 5  // <- ์ƒํƒœ์˜ ์›๋ณธ

    var body: some View {
        Gauge(value: rating, in: 0...10) {
            Text("Rating")
        }
        RatingView(rating: $rating)      // <- binding์„ ์ „๋‹ฌ
    }
}

 

๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š”:

  • RatingContainerView๋Š” rating์ด๋ผ๋Š” ์ƒํƒœ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค (@State).
  • RatingView๋Š” ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ฐธ์กฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค (@Binding).
  • ๋”ฐ๋ผ์„œ RatingView๋Š” ์ •๋ณด์˜ ์†Œ์œ ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ๋‹จ์ง€ ๊ฐ’์„ ํ‘œ์‹œํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

โœ… SwiftUI ๋‚ด์žฅ ๊ธฐ๋Šฅ

๋‹คํฌ๋ชจ๋“œ, ์œ ๋™์  ๊ธ€์ž ํฌ๊ธฐ ์กฐ์ ˆ, ํ˜„์ง€ํ™”
ํ”„๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ

 

 

๊ธฐ๊ธฐ์—์„œ ์ง์ ‘ ์ง„ํ–‰ ๊ฐ€๋Šฅ.

 

- ์„ ์–ธ์  ๋ทฐ์˜ ํ•œ ๊ฐ€์ง€ ์ด์  : ์ ์‘์„ฑ 

- ์ •ํ™•ํ•œ ์‹œ๊ฐ์  ๊ตฌ์„ฑ์ด ์•„๋‹Œ ๊ธฐ๋Šฅ์˜ ๋ชฉ์ ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

 

 

๋ฒ„ํŠผ์€ ์ ์‘ํ˜• ๋ทฐ์˜ ์ข‹์€ ์˜ˆ.

- 2๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ์†์„ฑ : action, action์„ ์„ค๋ช…ํ•˜๋Š” label

- ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ญ์ƒ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ๋™์ž‘์˜ ๋ชฉ์ ์„ ์ˆ˜ํ–‰

 

๋‹คborderless, bordered, prominent ์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์— ์ ์‘. swipe actions, menus, forms ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ์ž๋™์œผ๋กœ ์ ์‘
์ด๋Ÿฐ ํŒจํ„ด์€ ํ† ๊ธ€์„ ํฌํ•จํ•˜์—ฌ ์Šค์œ ์˜ ๋ชจ๋“  ์ปจํŠธ๋กค์— ์ ์šฉ๋จ. ํ† ๊ธ€์—๋Š” ์Šค์œ„์น˜, ์ฒดํฌ๋ฐ•์Šค, ๋ฒ„ํŠผ๊ณผ ๊ฐ™์€ ๊ณ ์œ ํ•œ ์Šคํƒ€์ผ์ด ์žˆ๋‹ค.

 

idiomatic style๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค ? 

 

Toggle("Nocturnal Mode", systemImage: "moon", isOn: $pet.isNocturnal)
→ ์ด ํ•œ ์ค„์˜ Toggle ์ฝ”๋“œ๊ฐ€ ๋‹ค์–‘ํ•œ ๋งฅ๋ฝ(context)์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ์Šคํƒ€์ผ(UI)๋กœ ๋ฐ”๋€๋‹ค๋Š” ๋œป์ด์—์š”.

์˜ˆ์‹œ: ๊ฐ™์€ ์ฝ”๋“œ, ๋‹ค๋ฅธ UI๋กœ ํ‘œํ˜„๋จ

  • โœ… Switch (์„ค์ • ํ™”๋ฉด์ด๋ผ๋ฉด ์ด๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์›€)
  • โ˜‘๏ธ Checkbox (์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋งฅ๋ฝ)
  • ๐ŸŒ™ Button (ํˆด๋ฐ”๋‚˜ ๋ช…๋ น ๋ฒ„ํŠผ ๋งฅ๋ฝ)
  • ↔๏ธ Swipe ์•ก์…˜ (๋ฆฌ์ŠคํŠธ์—์„œ ์Šค์™€์ดํ”„ ๋™์ž‘ ๋งฅ๋ฝ)
  • โ˜ฐ ๋ฉ”๋‰ด ํ•ญ๋ชฉ
  • ๐Ÿ“ Form ์•ˆ ํ† ๊ธ€

SwiftUI๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด Toggle์„ ์ž๋™์œผ๋กœ ํ™˜๊ฒฝ์— ๋งž๋Š” ๊ด€์šฉ์ ์ธ UI ์š”์†Œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

Toggle ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์–‘ํ•œ UI ๋งฅ๋ฝ์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ต์ˆ™ํ•œ UI ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

์ฆ‰, Toggle์€ ๋‹จ์ˆœํ•œ ์Šค์œ„์น˜์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์ฒดํฌ๋ฐ•์Šค, ๋ฒ„ํŠผ, ์Šค์™€์ดํ”„, ๋ฉ”๋‰ด ํ•ญ๋ชฉ ๋“ฑ ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋Š” '์Šค๋งˆํŠธํ•œ UI ๊ตฌ์„ฑ ์š”์†Œ'์ธ ๊ฑฐ์ฃ .

 

 

 

Searchable

searchable modifier๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ํ•œ์ •์ž๊ฐ€ ์ ์šฉ๋œ ๋ทฐ๋Š” ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ.

 

 

SwiftUI๋Š” ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ด€์šฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ์ˆ˜ํ–‰.

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ•œ์ •์ž๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ๊ฒฝํ—˜์„ ๋งž์ถคํ™”ํ•  ์ˆ˜ ์žˆ์Œ

 

-> ์ œ์•ˆ, ๋ฒ”์œ„, ํ† ํฐ ์ถ”๊ฐ€ ๋“ฑ์˜ ํ•œ์ •์ž

๋ฒ„ํŠผ, ํ† ๊ธ€, ํ”ผ์ปค -> ์ปจํŠธ๋กค, ์ปจํ…Œ์ด๋„ˆ๋ทฐ ๋˜๋Š” ๋งž์ถคํ™” ์ง€์› ๋‹ค์ค‘ ์—ด ํ…Œ์ด๋ธ” ๋“ฑ๋“ฑ
ํ•˜์œ„ ์ˆ˜์ค€ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ API ๋ ˆ์ด์–ด๋„ ์ค€๋น„๋˜์–ด์žˆ์Œ. ์ž์‹ ๋งŒ์˜ ์ปจํŠธ๋กค ์Šคํƒ€์ผ์„ ๋นŒ๋“œ

- ๋†’์€ ์„ฑ๋Šฅ์˜ ๋ช…๋ นํ˜• ๊ทธ๋ฆฌ๊ธฐ : canvas ์‚ฌ์šฉ

ํ•˜์œ„์ˆ˜์ค€์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ์ „์ ์ธ ํ”Œ๋ฆฝ๋ณด๋“œ๋ฅผ ์—ฐ์ƒ์‹œํ‚ค๋„๋ก ํ•จ. ์• ๋‹ˆ๋ฉ”์ด์…˜, ๊ทธ๋ž˜ํ”ฝ ํŠธ๋ฆญ๊ณผ ์•ฝ๊ฐ„์˜ metal ์…ฐ์ด๋”๋ฅผ ์‚ฌ์šฉ

- ๋†’์€ ์„ฑ๋Šฅ์˜ ๋ช…๋ นํ˜• ๊ทธ๋ฆฌ๊ธฐ : canvas ์‚ฌ์šฉ

 

 

App definition

 

์ „์ฒด ์•ฑ ์ •์˜๋Š” ๋ทฐ๊ฐ€ ๋”ฐ๋ฅด๋Š” ๋™์ผํ•œ ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œ. ์•ฑ์€ scene๋ณ„๋กœ ์ •์˜๋œ ์„ ์–ธ์  ๊ตฌ์กฐ.

- WindowGroup์€ Scene์˜ ํ•œ ์ข…๋ฅ˜์ด๋ฉฐ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ฝ˜ํ…์ธ  ๋ทฐ๋กœ ์ƒ์„ฑ๋จ 

 

๋งฅ OS์™€ ๊ฐ™์€ ๋ฉ€ํ‹ฐ ์œˆ๋„์šฐ ํ”Œ๋žซํผ์—์„œ๋Š” ์ถ”๊ฐ€ ์žฅ๋ฉด์ด ์•ฑ ๊ธฐ๋Šฅ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต

 

๋งž์ถคํ˜• ์œ„์ ฏ ๋นŒ๋“œ๋กœ ํ™•์žฅ

- ์œ„์ ฏ : ํ™ˆ ํ™”๋ฉด๊ณผ ๋ฐ์Šคํฌํƒ‘์— ํ‘œ์‹œ, ์ ์ˆ˜ํŒ ๋ทฐ ์ค‘ ์ผ๋ถ€๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๊ธ‰ ํ‘œ์‹œ 

 

 

โœ… ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ํ™œ์šฉ

- SwiftUI์˜ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์œผ๋กœ ํ™•์žฅ๋˜๋ฏ€๋กœ ํ•œ ํ”Œ๋žซํผ์—์„œ ํˆฌ์žํ•˜๊ณ  ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์„ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ์Œ

ํ•˜๋‚˜์˜ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด SwiftUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น UI๋ฅผ ๋ชจ๋“  ํ”Œ๋žซํผ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์ž‘์ด ๋จ

 

๋งฅ์—์„œ๋Š” ํ‚ค๋ณด๋“œ ํƒ์ƒ‰์ด๋‚˜ ์—ฌ๋Ÿฌ ์œˆ๋„์šฐ ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ง€์›
๊ฒ€์ƒ‰ ์ œ์•ˆ : ๋งฅ์—์„œ๋Š” ํ‘œ์ค€ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ์ƒ์„ฑ, iOS์—์„œ๋Š” ์˜ค๋ฒ„๋ ˆ์ด ๋ชฉ๋ก ์ƒ์„ฑ

 

 

ํ•˜์œ„์ˆ˜์ค€ API์—์„œ ๋งž์ถคํ˜•์œผ๋กœ ์ œ์ž‘๋œ ๋ทฐ๋Š” ํ”Œ๋žซํผ ์ „์ฒด์—์„œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ํ•„์š”ํ•  ๋•Œ ๋™์ผํ•œ ๋ทฐ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
ํ•œ๋ฒˆ ์ž‘์„ฑํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์‹คํ–‰๋˜๋Š”๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ํ•œ๋ฒˆ๋งŒ ์ตํžˆ๋ฉด ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

๊ฐ ํ”Œ๋žซํผ์— ํŠนํ™”๋œ API ๋„ ์žˆ์Œ

 

๋ชจ๋“  ํ”Œ๋žซํผ์€ ์‚ฌ์šฉ๋ฐฉ์‹๊ณผ ์„ค๊ณ„ ๋ฐฉ์‹ ๊ณ ์œ ํ•จ. HIG์—์„œ๋Š” ๊ตฌ์„ฑ์š”์†Œ, ํŒจํ„ด ํ•ด๋‹น ํ”Œ๋žซํผ์˜ ๊ณ ๋ ค์‚ฌํ•ญ ์„ค๋ช…

 

์›Œ์น˜ OS์— navigationSplitView๋Š” ์ž๋™์œผ๋กœ ์ ์‘
ํ„ฐ์น˜๋‚˜ ํ‚ค๋ณด๋“œ ๋Œ€์‹  ์›Œ์น˜์—์„œ๋Š” ๋””์ง€ํ„ธํฌ๋ผ์šด์„ ์‚ฌ์šฉํ•ด์„œ ๋“ฑ๊ธ‰์„ ์„ ํƒํ•˜๋ ค๋ฉด ??

 

๋™์ผ ์ ์ˆ˜ํŒ ๋ทฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ watchOS์šฉ ์ถ”๊ฐ€ ํ•œ์ •์ž์ธ digitalCrownRotation ์ถ”๊ฐ€

 

๋งฅ์—์„œ๋Š” ์œ ์—ฐํ•œ ์œˆ๋„์šฐ ๋ชจ๋ธ์„ ํ™œ์šฉ

 

๋น„์ „ OS๋กœ ๊ฐ€์ ธ์™€์„œ ๋ทฐ๋ฅผ ํ™œ์šฉ. ์ž…์ฒด ์ฝ˜ํ…์ธ  ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

 

 

โœ… ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ํ†ตํ•ฉ 

 

SwiftUI๋Š” ๊ฐ ํ”Œ๋žซํผ์˜ SDK์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

SwiftUI๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์ œ๊ณต


SwiftData

: ์•ฑ์— ์˜๊ตฌ์ ์ธ ๋ชจ๋ธ์„ ๋น ๋ฅด๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , SwiftUI๋ทฐ์—์„œ ํ•ด๋‹น ๋ชจ๋ธ์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” API๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋จ.

 

SwiftCharts

: SwiftUI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ๋งž์ถคํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ฐจํŠธ ํ”„๋ ˆ์ž„์›Œํฌ

UIKit ๋ฐ AppKit์€ ํ•„์ˆ˜์ ์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋ ˆ์ž„์›Œํฌ

 

- SwiftUI์™€ ์œ ์‚ฌํ•œ ๋นŒ๋”ฉ ๋ธ”๋ก์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ทฐ ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ์— ๋‹ค๋ฅธ ํŒจํ„ด์„ ์‚ฌ์šฉ 

- ํ•˜์ง€๋งŒ ์ƒํ˜ธ์šด์šฉ์ด ๊ฐ€๋Šฅ

 

 

 

- SwiftUI์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” UIKit ๋˜๋Š” AppKit์˜ ๋ทฐ ๋˜๋Š” ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ViewRepresentable์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

- ๋ช…๋ นํ˜• ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€๋œ UIKit ๋˜๋Š” AppKit๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•œ ํŠน์ˆ˜ SwiftUI ๋ทฐ ํ”„๋กœํ† ์ฝœ์ž„

- ๊ฒฐ๊ณผ๋Š” SwiftUI์˜ ์„ ์–ธ์  ๋ทฐ ๋นŒ๋” ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  HStack์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ๋ทฐ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ทฐ

 

 

<๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ>

 

- SwiftUI๋ทฐ๋ฅผ UIKit ๋˜๋Š” AppKit์˜ ๋ทฐ ๊ณ„์ธต ๊ตฌ์กฐ์— ํฌํ•จํ•˜๋ ค๋ฉด Hosting View Controller์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

- ๋ฃจํŠธ SwiftUI๋กœ ์ƒ์„ฑ

- ์•ฑ์ด ์ „๋ถ€ ์Šค์œ ์ผ ํ•„์š”๋Š” ์—†์Œ.

 

 

 

์ •๋ฆฌํ•˜์ž๋ฉด, SwiftUI๋Š” ์„ ์–ธ์ /๊ตฌ์„ฑ์ /์ƒํƒœ์ค‘์‹ฌ๋ทฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋‹ค !!

์ ์€ ์ฝ”๋“œ, ๊ด‘๋ฒ”์œ„ํ•œ ๊ตฌ์„ฑ์š”์†Œ, ์ ์ง„์ ์ธ ์ฑ„ํƒ

 

 

 

๋ฐ˜์‘ํ˜•