Search

[WWDC] The craft of SwiftUI API design: Progressive disclosure

๐ŸŽ

๋“ค์–ด๊ฐ€๋ฉฐ

SwiftUIํŒ€์€ SwiftUI๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์›์น™์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ, ๊ทธ ์›์น™ ์ค‘ ํ•˜๋‚˜์ธ โ€œProgressive Disclosureโ€ ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๐Ÿ‘จโ€๐Ÿฆฑ๐Ÿ™Œย : ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Component๋‚˜ ์ถ”์ƒํ™” ์ž‘์—…์„ ํ•˜๋Š” ์ˆœ๊ฐ„ ์—ฌ๋Ÿฌ๋ถ„๋„ API ๋””์ž์ด๋„ˆ ๋ž๋‹ˆ๋‹ค.
์ด๋ฒˆ ์„ธ์…˜์—์„œ๋Š” SwiftUIํŒ€์˜ ์„ค๊ณ„ ๊ณผ์ •์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ณ  โ€œProgressive Disclosureโ€์— ๊ด€ํ•ด ๋ฐฐ์šด ๊ฑธ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์žฌ์‚ฌ์šฉ ์š”์†Œ๋‚˜ ์ถ”์ƒํ™” ์ž‘์—…์„ ํ•  ์‹œ์— ์ƒˆ๋กœ์šด ๋„๊ตฌ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ง์ด์ฃต.

Progressive Disclosure

Progressive Disclosure๋Š” API ์„ค๊ณ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํ•ด์š”. ์ผ๋ฐ˜์ ์ธ macOS UI์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ, macOS์— ์žˆ๋Š” ์ €์žฅํ•˜๊ธฐ ์ฐฝ์„ ๋ณผ๊ฒŒ์š”.
์ฒ˜์Œ ์ €์žฅํ•˜๊ธฐ ์ฐฝ์ด ๋‚˜ํƒ€๋‚  ๋•Œ๋Š” ๊ธฐ๋ณธ ์ €์žฅ ์œ„์น˜๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐฝ์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—๋Š” ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์œ„์น˜๊ฐ€ ์žˆ์–ด์„œ ์„ ํƒ ๊ฐ€๋Šฅ์„ฑ์ด ํฐ ์œ„์น˜์— ์‰ฝ๊ฒŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์›ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ฒ€์ƒ‰ํ•˜๋ ค๊ณ  ์ฐฝ์„ ๋” ํ™•๋Œ€ํ•˜๋ฉด ์œ„์˜ UI๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋‹จ๊ณ„์ ์œผ๋กœ ๋” ๋ณต์žกํ•œ UI๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.
์ด๋Ÿฐ ๊ฒฝํ—˜์„ API์—์„œ๋„ ์ œ๊ณตํ•˜๊ณ ์ž ํ•ด์š”. ๋ฉ‹์ง„ UI ๊ฒฝํ—˜์„ ์ฝ”๋“œ์—์„œ ์ œ๊ณตํ•˜๋ ค๋ฉด API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋А๋‚Œ์ด ์ข‹์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋“œ๋ฅผ โ€œDeclaration siteโ€์˜ ์ž…์žฅ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋ผ๋ด์š”. ํ•˜์ง€๋งŒ ์ฝ”๋“œ ์‚ฌ์šฉ์˜ ๋А๋‚Œ์„ ์ข‹๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ, โ€œCall Siteโ€์—์„œ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
API ์„ค๊ณ„์—์„œ๋Š” Use case์˜ ๋ณต์žก๋„์— ๋”ฐ๋ผ Call Site์˜ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉฐ โ€œProgressive Disclosureโ€๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ–ถ๏ธย  ์ด์ƒ์ ์ธ API๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ ‘๊ทผ์„ฑ์ด ์ข‹์ง€๋งŒ ๊ฐ•๋ ฅํ•œ Use case๋„ ์ˆ˜์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ํฐ ์ด์ ์„ ์ค˜์š”!
โ€ข
์ฒซ ๋นŒ๋“œ์™€ ์‹คํ–‰์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜์—ฌ API๋ฅผ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
โ€ข
learning curve๊ฐ€ ๋‚ฎ์•„์„œ ์ฝ”๋“œ์— ์‰ฝ๊ฒŒ ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.
โ€ข
ํ”ผ๋“œ๋ฐฑ ์ฃผ๊ธฐ๊ฐ€ ๊น”๋”ํ•ด์ง‘๋‹ˆ๋‹ค. Progressive Disclosure๋ฅผ ์ฑ„ํƒํ•˜๋Š” API๋Š” ๊ฐ ๋‹จ๊ณ„์— ๋งŒ๋“ค ๊ฑธ ๋ณด๊ณ  ํ•œ ๋ถ€๋ถ„์”ฉ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•ด์ ธ์š”.
โ˜‘๏ธย  ๋น ๋ฅธ ์ฃผ๊ธฐ๋กœ ์•ฑ์„ ๊ฐœ์„ ํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ํฐ ๋…ธ๋ ฅ์„ ํˆฌ์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์š”.
๐Ÿค”ย : ํ•ด๋‹น ์›์น™์„ ํŠน์ • API ์„ค๊ณ„์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ๊นŒ์š”?
1.
Consider common use cases : ๊ธฐ๋Šฅ์„ Progressive disclosureํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํ•œ ์ผ€์ด์Šค์˜ ํ˜•ํƒœ ํŒŒ์•…
2.
Provide intelligent defaults : ํ•„์š”ํ•  ๋•Œ๋งŒ ์ผ๋ฐ˜์ ์ธ ์‚ฌ๋ก€๋ฅผ ๊ตฌ์ฒดํ™”
3.
Optimize the call site : call site์˜ ๋ชจ๋“  ๊ธ€์ž์— ๋ชฉ์ ์„ ๋ถ€์—ฌ
4.
Compose, donโ€™t enumerate : ์—ด๊ฑฐํ•˜๋Š” ๋Œ€์‹  ๊ฐ ์กฐ๊ฐ์„ ๊ตฌ์„ฑ

Consider common use cases

Consider common use cases์˜ ์˜ˆ๋ฅผ ๋ณผ๊ฒŒ์š”. SwiftUI์˜ Label์ด ์ด ๋ถ€๋ถ„์„ ์ž˜ ๋‹ด๊ณ  ์žˆ์–ด์š”.
๋ฒ„ํŠผ์„ ๋งŒ๋“ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฒ„ํŠผ์˜ ๋ ˆ์ด๋ธ”์„ ๋งŒ๋“ค๋ผ๋Š” ์š”๊ตฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต์˜ ๋ฒ„ํŠผ์€ ํ…์ŠคํŠธ๋ฅผ ํ•˜๋‹จ์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ SwiftUI๋กœ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜๊ฐ€ ์žˆ์ฃ .
ํ•˜์ง€๋งŒ ๋ฒ„ํŠผ์„ ์ปค์Šคํ…€ํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด SwiftUI์˜ ๋‹ค๋ฅธ override ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ ˆ์ด๋ธ” ํ˜•ํƒœ์˜ ์ž„์˜์˜ ๋ทฐ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ ๋•Œ๋Š” ๊ฐ„๋‹จํ•œ ์ปจํŠธ๋กค์—๋„ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์ฃ .
๋Œ€๋ถ€๋ถ„(99%)์€ ๊ฐ„๋‹จํ•œ ๋ฒ„์ „๋งŒ ํ•„์š”ํ•˜๊ธด ํ•ฉ๋‹ˆ๋‹ค.

Provide intelligent defaults

Common use case ์‚ฌ๋ก€๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌ์ฒดํ™”ํ•˜์ง€ ์•Š๋Š” Intelligent defaults๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. SwiftUI ์ „์ฒด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” API๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.
ํ…์ŠคํŠธ!
Text ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ์— ์ข‹์€ ์˜ˆ์‹œ์ฃ . ์ด ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๋”ฐ๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ ๋”ฐ๋กœ ์ƒ๊ฐํ•  ํ•„์š”๋„ ์—†์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค
SwiftUI๋Š” ํ™˜๊ฒฝ Local์˜ ์•ฑ ๋ฒˆ๋“ค ์•ˆ์— ์žˆ๋Š” Localization ์ŠคํŠธ๋ง์„ ๊ฒ€์ƒ‰ํ•ด์„œ ํ…์ŠคํŠธ๋ฅผ ํ˜„์ง€ํ™” ์‹œ์ผœ์ค˜์š”.
ํ˜„์žฌ ์„ค์ •ํ•œ ์ƒ‰์ƒ์— ์ž๋™์œผ๋กœ ๋งž์ถฐ์„œ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ๋ฐ”๋กœ ์ง€์›ํ•ด์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
Dynamic type๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํฌ๊ธฐ ์„ค์ •์— ๋”ฐ๋ผ ๊ธ€์ž ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง‘๋‹ˆ๋‹ค.
2๊ฐœ์˜ ํ…์ŠคํŠธ๋ฅผ ์œ„์•„๋ž˜๋กœ ๋ฐฐ์น˜ํ•œ ๊ฒฝ์šฐ ํ…์ŠคํŠธ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ํ˜„์žฌ ํ…์ŠคํŠธ์˜ ๋งฅ๋ฝ์— ๋งž๊ฒŒ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•ด์š”.
๋ชจ๋“  ๋™์ž‘์€ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ SwiftUI์˜ Intelligent default ๋•๋ถ„์— common use case์™€ ๊ด€๋ จ ์—†๋Š” ๋‚ด์šฉ์€ call site์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„์š”.
โ˜‘๏ธย  ํ…์ŠคํŠธ๋Š” API ์ค‘์—์„œ๋„ ๊ต‰์žฅํžˆ ๋ฏธ๋‹ˆ๋ฉ€ํ•œ ์˜ˆ์‹œ์ง€๋งŒ Intelligent default๋Š” ๋ชจ๋“  call site์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
Toolbar๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณผ๊ฒŒ์š”.
๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” Toolbar๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฒ„ํŠผ์˜ ์œ„์น˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋ฒ„ํŠผ์ด ํ”Œ๋žซํผ์— ๋งž๊ฒŒ ๋ฐฐ์น˜๋  ๊ฒ๋‹ˆ๋‹ค.
macOS์—์„œ๋Š” Toolbar๊ฐ€ ์™ผ์ชฝ์— ๋‚˜ํƒ€๋‚˜์ง€๋งŒ iOS์—์„œ๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ”์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. watchOS์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ๋งŒ์ด ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ” ์•„๋ž˜ ๊ณ ์ •๋ผ์–ด ์žˆ์–ด์š”.
์›ํ•œ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Intelligent default๊ฐ€ ๋Œ€๊ฐœ์˜ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค˜์š”. ๐Ÿ‘๐Ÿป

Optimize the call site

Common Use case๋ฅผ ๊ณ ๋ คํ•˜๊ณ  Intelligent default๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋ฉ‹์ง„ ๊ฒฝํ—˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ API๊ฐ€ ๋ฌด๊ฒ๊ฒŒ ๋А๊ปด์ง€๊ฑฐ๋‚˜ ์ •์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝํ—˜์„ ๋ง์น  ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๋งˆ์ง€๋ง‰ ์ „๋žต์ด Call site ์ตœ์ ํ™”์ž…๋‹ˆ๋‹ค.
Table๋ฅผ ์‚ดํŽด๋ณผ๊ฒŒ์š”.
์—ด์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ํ‘œ๋Š” ๊ธฐ๋Šฅ์ด ์„ค์ •ํ•  ๊ฒŒ ๋งŽ๊ณ  ๊ธฐ๋Šฅ๋„ ๋งŽ์•„์š”. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š” ์—†์–ด์š”.
Common usecase์—๋„ ํ›Œ๋ฅญํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ด์š”. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„๋‹จํ•œ ํ‘œ์— ๊ด€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค. ํ‘œ๋Š” ๊ฐ ํ–‰์— ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…์‹œํ•ด์š”.
์ด ํ‘œ๋Š” ํ˜„์žฌ ์ฝ๋Š” ์ฑ…์„ ์—ด๊ฑฐํ•˜๊ณ  ์žˆ์–ด์š”. ๊ฐ ์ฑ…์— ๋Œ€ํ•œ ํ–‰๋„ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์—๋Š” ๊ฐ ํ–‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ด์— ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์—๋Š” ์ œ๋ชฉ ์—ด๊ณผ ์ž‘๊ฐ€ ์—ด์ด ์žˆ๋„ค์š”.
๋˜ํ•œ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์—ด์˜ ์ œ๋ชฉ์„ ํด๋ฆญํ•  ๋•Œ ์ •๋ ฌ์ด ๋ณ€๊ฒฝ๋˜๋„๋ก ํ–ˆ์ฃ .
๋งˆ์ง€๋ง‰์œผ๋กœ ์ •๋ ฌ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ํ‘œ๋ฅผ ์žฌ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค ์ •๋ณด๊ฐ€ ๋งŽ์œผ๋‹ˆ๊นŒ ์ผ๋‹จ ์‚ดํŽด๋ณด๋ฉด์„œ Progressive disclosure๋ฅผ ์ ์šฉํ•˜์—ฌ call site๋ฅผ ์ตœ์ ํ™”ํ•ด ๋ณด์ฃ 
๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ™œ์šฉ ์‚ฌ๋ก€๋Š” ํ–‰๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ฐœ๋Š” ํ–‰ ์˜์—ญ์ด ์ด ์˜ˆ์‹œ์™€ ๋น„์Šทํ•  ๊ฑฐ์˜ˆ์š” ์ปฌ๋ ‰์…˜์— ForEach ๋ฌธ์„ ๋Œ๋ ค ๊ฐ ํ•ญ๋ชฉ์— ํ–‰์„ ์ œ๊ณตํ•˜์ฃ 
ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด ๊ณผ์ •์„ ๋ฃจํ•‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ปฌ๋ ‰์…˜์„ ํ‘œ์— ์ง์ ‘ ํ†ต๊ณผ์‹œ์ผœ ForEach ๋™์ž‘์€ ๋ฐฐ๊ฒฝ์—์„œ ์ˆ˜ํ–‰๋˜๋„๋ก ํ•˜์—ฌ Call site๋ฅผ ๋‹จ์ˆœํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋” ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋Œ€๋ถ€๋ถ„์˜ ํ‘œ์— ๋‚˜ํƒ€๋‚ด๋ ค๋Š” ๊ฐ’์ด String์ด๋ฉด Text๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ด์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ€์ด์Šค์— ๋งž๊ฒŒ Call site๋ฅผ ์ตœ์ ํ™”ํ–ˆ์ฃ .
๊ฐ’์˜ ํ‚คํŒจ์Šค๊ฐ€ ์ŠคํŠธ๋ง์„ ์ง€์ •ํ•  ๋•Œ TableColumn๊ณผ ๊ด€๋ จ๋œ ๋ทฐ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋” ์ตœ์ ํ™”ํ•ด๋ณผ๊ฒŒ์š”.
Call site์— ์žˆ๋Š” ์ •๋ณด ์ค‘์—์„œ ๋ชจ๋“  ํ‘œ์— ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ •๋ ฌ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ™œ์šฉ ์‚ฌ๋ก€๋Š” ์ •๋ ฌ์—๋Š” ๊ด€์‹ฌ์ด ์—†์–ด์š”.
์ฆ‰, ์ด๊ฒŒ ์ตœ์ข… ์ฝ”๋“œ๊ฒ ๊ตฐ์š”.!
Call site์˜ ๋ชจ๋“  ๊ธ€์ž๊ฐ€ ๋ช…ํ™•ํ•œ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ Processiveํ•˜๊ฒŒ ์ค‘์š”ํ•œ ์งˆ๋ฌธ 2๊ฐœ๋ฅผ ๋˜์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
API์— ์ฃผ๋Š” ์˜ํ–ฅ์„ ์ œ๋Œ€๋กœ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธธ์„ ์žƒ์„ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ ?

Compose, donโ€™t enumerate

Stacks, ํŠนํžˆ HStack๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ์š”.
์ผ๋‹จ HStack์—์„œ ๊ฐ€์žฅ ํ•ต์‹ฌ ์ •๋ณด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. HStack์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ทฐ ๋นŒ๋”๊ฐ€ ์žˆ์œผ๋‹ˆ ์ •๋ ฌ์— ์ดˆ์ ์„ ๋งž์ถฐ์„œ ์ง„ํ–‰ํ• ๊ฒŒ์š”.
์™ผ์ชฝ์— ์ƒ์ž๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ฒ ์ฃ . ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ๋„ ์ผ๋ฐ˜์ ์ธ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค ์š”์†Œ๋ฅผ ์˜ค๋ฅธ์ชฝ์— ๋งž์ถฐ ์ •๋ ฌํ•  ์ˆ˜๋„ ์žˆ์ฃ .
VStack์—๋Š” ์ด๋ฏธ ์ •๋ ฌ ๊ด€๋ จ API๊ฐ€ ์žˆ๋Š”๋ฐ enum์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ์ง€์›ํ•˜์ฃ .
๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์š”์†Œ์˜ ๊ฐ„๊ฒฉ์„ ์ผ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๊ฑฐ๋‚˜ ์š”์†Œ ์‚ฌ์ด์—๋งŒ ๊ฐ„๊ฒฉ์„ ๋‘๊ฑฐ๋‚˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ „์—๋งŒ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?
์ด๋ ‡๊ฒŒ ํ•ญ๋ชฉ์ด ๋งŽ์•„์งˆ๊ฒ๋‹ˆ๋‹ค.
์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ๋„ ํž˜๋“ค๊ณ , ์›ํ•˜๋Š” ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ enum์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์œ ์šฉํ•œ ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด๋‚ด์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.
์ผ๋ฐ˜์ ์ธ ์ผ€์ด์Šค๋งŒ ์—ด๊ฑฐํ•˜๊ณ  ํŽธ์˜์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด API๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ ์„œ ํ•ด๊ฒฐ์ฑ…์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”!
์—ด๊ฑฐ ๋Œ€์‹  ๊ตฌ์„ฑํ•˜์„ธ์š”.
Stack์˜ ๊ฒฝ์šฐ์—๋Š” SwiftUI๋Š” Spacer๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์—ด๊ฑฐํ–ˆ๋˜ ๋ชจ๋“  ์ •๋ ฌ ๋ฐฉ์‹์€ ๋ฌผ๋ก  ํ›จ์”ฌ ๋งŽ์€ ์ •๋ ฌ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
โ€œProcessive disclosureโ€๋ฅผ ํ†ตํ•ด Call site๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Call site์—์„œ ๋ชจ๋“  ์ผ€์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ–ˆ๊ณ  Compose๋ฅผ ํ†ตํ•ด์„œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์–ด์š”!
โ€ข
โ€œProcessive disclosureโ€๋ฅผ ์ ์šฉํ•˜๋ฉด Common use case์—์„œ ์‹œ๊ฐ„์„ ์•„๊ปด์คŒ
โ€ข
Intelligent default๋กœ Common use case์— ๊ด€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋จ
โ€ข
Call site๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ๋ฐ˜๋ณต ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰
โ€ข
Compose๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํ™œ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ์—ฐํ•œ API ๋งŒ๋“ค๊ธฐ ๊ฐ€๋Šฅ
์—ฌ๋Ÿฌ๋ถ„๋„ API ์„ค๊ณ„์ž์ด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์ฃ . ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์„ค๊ณ„ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐœ์ธ ์šฉ๋„์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.