Skip to content

[WWDC19] SwiftUI Essentials

Elbin edited this page Dec 5, 2022 · 4 revisions

이글은 WWDC19 SwiftUI Essentials 을 보고 정리 ν•œ κΈ€ μž…λ‹ˆλ‹€.

🎁 intro

IG07Wwy

SwiftUI λŠ” 바퀴λ₯Ό 재발λͺ…ν•˜λ €κ³  ν•˜μ§€ μ•ŠλŠ”λ‹€. μš°λ¦¬κ°€ 전에 UIKit μ—μ„œ μ‚¬μš©ν•˜λ˜ λ‹€μ–‘ν•œ μ»΄ν¬λ„ŒνŠΈλ“€ 그리고 λ‹€μ–‘ν•­ κΈ°λŠ₯듀이 이미 λͺ¨λ‘ λ“€μ–΄κ°€ μžˆλ‹€. κ·Έμ € 방법을 바꿨을 뿐이닀.

HPFBoFw 기본적인 것은 μ‰½κ²Œ κ΅¬ν˜„ν•  수 있게 도와주고 자유둭게 μ»€μŠ€ν…€ ν•  수 μžˆλ„λ‘ λ§Œλ“€μ—ˆλ‹€κ³  ν•œλ‹€.

πŸ₯‘ View and modifiers

아보카도 ν† μŠ€νŠΈ μ£Όλ¬Έ 앱을 λ§Œλ“€λ©΄μ„œ SwiftUI와 μΉœν•΄μ Έ 보자.

Gwypwiy

이 ν™”λ©΄μ—μ„œ λ³΄μ΄λŠ” λͺ¨λ“  것은 View 둜 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

이 말을 μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œ 이야기λ₯Ό 더 λ“€μ–΄λ³΄μž.

IA0ywqs

일단 UIKit μ—λŠ” UIView κ°€ 있고 AppKit μ—λŠ” NSView κ°€ μžˆλ‹€. SwiftUI μ—λŠ” View κ°€ μžˆλ‹€!

szJJGqg

JJ7xJwI

SwiftUI μ—μ„œ 이런 μ‹μœΌλ‘œ 계측ꡬ쑰와 μ½”λ“œκ°€ μž‘μ„±λœλ‹€.

아직 SwiftUI λ₯Ό 잘 λͺ¨λ₯Έλ‹€κ³  해도 UIKit 을 μ•ˆλ‹€λ©΄ μ—¬κΈ°μ„œ μ΄μƒν•œ 점을 λ°œκ²¬ν•  수 μžˆλ‹€.

addSubView 같은 ν•¨μˆ˜κ°€ μ—†λ‹€λŠ” 것이닀.

계측 ꡬ쑰λ₯Ό μœ„ν•΄μ„œ κ·Έ ν•¨μˆ˜κ°€ ν•„μš”ν•œλ° 말이닀.

μ™œλƒν•˜λ©΄ SwiftUIλŠ” View 계측 ꡬ쑰λ₯Ό ν•˜λ‚˜μ”© κ΅¬μΆ•ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ™„μ„±λœ ꡬ쑰체λ₯Ό λ§Œλ“€κ³  그것을 μ΄ˆκΈ°ν™” ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

이 말은 즉

그건 UIKit 은 imperatively(λͺ…μ‹œμ μœΌλ‘œ) ν•˜κ²Œ μž‘λ™ν•˜κ³  SwiftUI λŠ” declaratively(μ„ μ–Έμ μœΌλ‘œ) ν•˜κ²Œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

(ν•˜λ‚˜λ„ 이해 μ•ˆλ˜λŠ”κ²ƒμ΄ 정상 계속 μ½μ–΄λ³΄μž...)

🍞 imperatively VS declaratively

그건 UIKit 은 imperatively(λͺ…μ‹œμ μœΌλ‘œ) ν•˜κ²Œ μž‘λ™ν•˜κ³  SwiftUI λŠ” declaratively(μ„ μ–Έμ μœΌλ‘œ) ν•˜κ²Œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

λͺ…μ‹œμ μ΄κ³  μ„ μ–Έμ μΈκ²Œ 무엇인지 μ•ŒκΈ° μœ„ν•œ μ˜ˆμ‹œλ₯Ό 보자. λͺ…μ‹œμ μœΌλ‘œ 아보카도 ν† μŠ€νŠΈλ₯Ό λ§Œλ“€μ–΄ 보자.

frJsSWQ

ltDaDQD

λͺ…μ‹œμ μœΌλ‘œ 아보카도 ν† μŠ€νŠΈλ₯Ό λ§Œλ“ λ‹€λŠ” 것은 μΉœκ΅¬ν•œν…Œ μ „ν™”λ‘œ μ–΄λ–»κ²Œ 아보카도 ν† μŠ€νŠΈλ₯Ό λ§Œλ“œλŠ”μ§€ μ„€λͺ…ν•˜λŠ” 것과 κ°™λ‹€.

그럼 μ„ μ–Έμ μœΌλ‘œ 아보카도 ν† μŠ€νŠΈλ₯Ό λ§Œλ“œλŠ” 것을 보자.

μ„ μ–Έμ μœΌλ‘œ 아보카도 ν† μŠ€νŠΈλ₯Ό λ§Œλ“œλŠ” 것은 아보카도 μž₯μΈμ—κ²Œ 아보카도 ν† μŠ€νŠΈλ₯Ό μ£Όλ¬Έν•˜λŠ” 것이닀.

V1Wgfxc

이제 λ‹€μ‹œ μ½”λ“œλ₯Ό ν•˜λ‚˜ν•œ λœ―μ–΄λ³΄μž. SwiftUI κ°€ κ·Έ 아보카도 μž₯인 역할이닀! μ•Œμ•„μ„œ 해쀄 것이닀.

spPGlca

Contianer 에 closure λŠ” ViewBuilder λΌλŠ” μ•„μ£Ό νŠΉμˆ˜ν•œ λ…€μ„μœΌλ‘œ λ˜μ–΄ μžˆλ‹€. 일단은 κ·Έ ν΄λ‘œμ € μ•ˆμ— 선언을 ν•˜κΈ°λ§Œ ν•˜λ©΄ View μ—μ„œ λ³Ό 수 μžˆλ‹€λŠ” 것을 μ•Œμ•„ 두면 λœλ‹€.

Hm2xgVk

Container 에 λŒ€ν‘œμ μΈ 예λ₯Ό VStack 을 보자. μ•ˆμ— λ‹€λ₯Έ View 듀이 λ“€μ–΄κ°€ μžˆλ‹€. (SwiftUI μ—μ„œλŠ” Image 도 Text 도 View 이닀.)

RWz8LdI

μ’€ 더 κΉŠμ€ 이해λ₯Ό μœ„ν•΄ 제 VStack 의 λ‚΄λΆ€κ΅¬ν˜„μ„ μ‚΄νŽ΄λ³΄μž.

content λΌλŠ” νŒŒλΌλ―Έν„°κ°€ 있고, ν΄λ‘œμ € νƒ€μž…μ„ λ°›κ³  μžˆμ§€λ§Œ, @ViewBuilder κ°€ λΆ™μ–΄ μžˆλ‹€.

Swift μ»΄νŒŒμΌλŸ¬κ°€ 이 ν΄λ‘œμ €μ•ˆμ— μžˆλŠ” λͺ¨λ“  뷰의 값을 λͺ¨μ•„μ„œ ν•˜λ‚˜μ˜ VStack 으둜 λ‹€μ‹œ λ¦¬ν„΄ν•˜λŠ” 법을 μ•Œκ³  μžˆλ‹€.

vgbrq5N

μš°λ¦¬λŠ” 이 ν΄λ‘œμ € μ•ˆμ— Text Toggle Stepper λ“± μ–΄λ–€ μ’…λ₯˜μ˜ View λ“  넣을 수 μžˆλ‹€.

PAByh0Z

μ΅μˆ™ν•˜μ§€ μ•Šμ€ 문법인 $ (λ‹¬λŸ¬μ‹ΈμΈ) 이 μžˆλ‹€. λ‹¬λŸ¬μ‹ΈμΈμ€ 일반적인 κ°’ λŒ€μ‹  바인딩 값을 μ „λ‹¬ν•˜κ³  μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

YXaAAIE

@Stateλ₯Ό μ‚¬μš©ν•œ proertyλ₯Ό SwiftUIκ°€ 보면, μžλ™μœΌλ‘œ Scene λ’€μ—μ„œ 지속 μƒνƒœλ₯Ό 생성 및 κ΄€λ¦¬ν•œ λ‹€μŒμ— 이 속성을 톡해 ν•΄λ‹Ή μƒνƒœκ°’μ„ λ…ΈμΆœν•œλ‹€.

μŠ€ν…ŒνΌλ₯Ό λˆ„λ₯Ό λ•Œ 값을 μˆ˜μ • ν•  μˆ˜λ„ μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, λ°”μΈλ”©ν•œ 값을 λ°›λŠ”λ‹€.

바인딩에 λŒ€ν•΄μ„œ μžμ„Έν•œ 것을 μ•Œκ³  μ‹ΆμœΌλ©΄ SwiftUI Data Flow WWDC λ₯Ό μ‹œμ²­ν•˜λΌκ³  ν•œλ‹€.

🍞 modifier

SwiftUIλŠ” View 계측 ꡬ쑰λ₯Ό ν•˜λ‚˜μ”© κ΅¬μΆ•ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ™„μ„±λœ ꡬ쑰체λ₯Ό λ§Œλ“€κ³  그것을 μ΄ˆκΈ°ν™” ν•œλ‹€.

λΌλŠ” 말을 μ΄ν•΄ν•˜λ €λ©΄ modifier 에 λŒ€ν•΄μ„œ μ•Œμ•„μ•Ό ν•œλ‹€.

rx4LeJJ SwiftUI μ—μ„œ modifier 을 μ΄μš©ν•΄ μƒˆλ‘œμš΄ λ·°λ₯Ό λ§Œλ“ λ‹€.

bR4q965

μ˜ˆμ‹œλ₯Ό 보자. .modifer λ₯Ό μ‚¬μš©ν•΄μ„œ μƒˆλ‘œμš΄ κ°œλ…μ„ κ³„μ†ν•΄μ„œ μΆ”κ°€ν•  수 μžˆλ‹€. chaining도 ν•  수 μžˆλ‹€!

UIKit을 계속 썻닀면 μ΄μƒν•˜λ‹€κ³  생각 ν•  수 μžˆλ‹€. μ™œλƒν•˜λ©΄ μ—¬νƒœκ» 계측ꡬ쑰λ₯Ό κ°€λ³κ²Œ μœ μ§€ν•˜λ„λ‘ ν–ˆμœΌλ‹ˆκΉŒ.

κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” 선언적 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μžˆλ‹€. 선언적 μ½”λ“œλŠ” λ‹€λ₯΄κ²Œ μž‘λ™ν•œλ‹€. 마치 κ³ μ°¨ν•¨μˆ˜μ˜ return κ°’ μ—¬λŸ¬κ°œλ₯Ό 체이닝 ν•˜λ“―μ΄ λͺ¨λ“  modifier λŠ” View λ₯Ό λ°›μ•„μ„œ View λ₯Ό λ¦¬ν„΄ν•œλ‹€.

κ·Έλž˜μ„œ 계측 ꡬ쑰λ₯Ό ν•˜λ‚˜μ”© κ΅¬μΆ•ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ™„μ„±λœ ꡬ쑰체λ₯Ό λ§Œλ“€κ³  그것을 μ΄ˆκΈ°ν™” ν•œλ‹€. λΌλŠ” 말이 λ‚˜μ˜€λŠ” 것이닀. addSubView κ°€ ν•„μš” μ—†λŠ” μ΄μœ λ„ 이미 λͺ¨λ“  SubView 듀을 κ°€μ§„ μƒνƒœμ—μ„œ μ΄ˆκΈ°ν™”κ°€ μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ΄λ‹€.

SwiftUI λ₯Ό λ§Œλ“€λ©΄μ„œ λ§Žμ€ 고민을 ν–ˆκ³  Scene μ—μ„œ rendering μ‹œμŠ€ν…œμ—μ„œ μ΅œμ ν™”λ₯Ό ν•΄μ£ΌκΈ° λ•Œλ¬Έμ—, μ„±λŠ₯에 λŒ€ν•œ λ¬Έμ œλŠ” κ±±μ •ν•  ν•„μš”κ°€ μ—†λ‹€κ³  ν•œλ‹€.

πŸ€— modifier 의 이점 πŸ€—

  1. μˆœμ„œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ•Œ 수 μžˆλ‹€.
  2. View 간에 κ³΅μœ κ°€ κ°€λŠ₯ν•˜λ‹€.

μˆœμ„œλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ•Œ 수 μžˆλ‹€. μš°λ¦¬λŠ” λ‹€μ–‘ν•œ feature 듀이 μ μš©λ˜λŠ” μˆœμ„œλ₯Ό 정해쀄 수 μžˆλ‹€.

6UcyUld μœ„μ˜ μ΄λ―Έμ§€λŠ” λ°±κ·ΈλΌμš΄λ“œλ₯Ό λ¨Όμ € μ£Όκ³  νŒ¨λ”©μ„ 쀀것 이고

M2WjiVQ μœ„μ˜ μ΄λ―Έμ§€λŠ” νŒ¨νŒ…μ„ λ¨Όμ € μ£Όκ³  λ°±κ·ΈλΌμš΄λ“œλ₯Ό μ€€ 것 이닀.

λ‘κ°œμ˜ κ²°κ³Όκ°€ λ‹€λ₯Έκ²ƒμ€ modifierκ°€ μˆœμ„œλŒ€λ‘œ μž‘λ™ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

이게 λ§Œμ•½μ˜ modifier κ°€ μ•„λ‹Œ, ν…μŠ€νŠΈμ˜ 속성이라고 ν•œλ‹€λ©΄ λ¬Έμ„œλ₯Ό μ½κ±°λ‚˜ μ‹€ν—˜μ„ 해보지 μ•Šκ³ λŠ” μ–΄λ–€ 속성이 λ¨Όμ € μ μš©λ˜λŠ”μ§€ μ•Œ 수 κ°€ μ—†λ‹€.

modifier λ₯Ό μˆœμ„œλŒ€λ‘œ μ—°κ²°ν•΄μ„œ λͺ…μ‹œμ μœΌλ‘œ μˆœμ„œλ₯Ό μ•Œλ €μ£Όκ³  μžˆλŠ” 것이닀.

View 간에 κ³΅μœ κ°€ κ°€λŠ₯ν•˜λ‹€.

eDbNyCq 각각의 View 에 opacity modifier λ₯Ό μ„€μ •ν•΄ 쀄 수 μžˆλ‹€. 같은 것은 λ°˜λ³΅ν•΄μ„œ λ‹€λ‹ˆ μ½”λ“œκ°€ μ§€μ €λΆ„ν•˜λ‹€.

LclbuVl μœ„μ™€ 같이 VStack 에 opacity modifier λ₯Ό μ„€μ •ν•˜λ©΄ ν•˜μœ„ λͺ¨λ“  뷰에도 적용이 λ˜μ–΄μ„œ μœ„μ˜ μ½”λ“œμ™€ 같은 ν˜•νƒœλ₯Ό λ³Ό 수 μžˆλŠ”λ° μ½”λ“œλŠ” 더 깔끔해 μ§„λ‹€!

xKjkuIP

MXiEkFh

πŸ₯‘ Building custom Views

Clone this wiki locally