๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Dev Blog
iOS/SwiftUI

[SwiftUI] - Stanford CS193P : Spring 2021(1๊ฐ•)

by ์œ ์ง„์˜ 2022. 2. 22.

Lecuter 1 : Getting started with SwifUI

 

 ๊ฐ•์˜ ์ฃผ์š” ํƒ€์ž„์Šคํƒฌํ”„ 

ํƒ€์ž„๋ผ์ธ Content
40:00 View์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์ด๋ž€?
43:09 some View์— ๋Œ€ํ•œ ์งˆ๋ฌธ + Lego ๋น„์œ 
50:03 View์—์„œ์˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
53:30 some View์— ๋Œ€ํ•œ ๋‹ต
58:59 View Modifier๋ž€?
1:05:00 stroke ๋ฉ”์„œ๋“œ
1:07:15 Add Modifier
1:09:25 ZStack์ด๋ž€?
1:10:38 View Builder๋ž€?
1:14:34 view modifier ์ ์šฉ์˜ 2๊ฐ€์ง€ ์ผ€์ด์Šค
1:18:02 SwiftUI ์ฝ”๋“œ ์Šคํƒ€์ผ

๊ฐ•์˜ ๋‚ด์šฉ ์ •๋ฆฌ

 

View๋ž€?

  • View๋Š” ์Šคํฌ๋ฆฐ ์ƒ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ์˜์—ญ์—์„œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ์ถœ๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ
  • simple view , combining view , bag of views์˜ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

        * Bag of Views : ์—ฌ๋Ÿฌ View๋“ค์„ View Builder๋ฅผ ํ†ตํ•ด ํ•œ ์˜์—ญ์— ๋ชจ์•„๋‘” ๊ฒƒ

        * Combining View : Bag of Views๋“ค์„ ์กฐํ•ฉํ•œ ๊ฒƒ

 

 struct ContentView: View {
 	var body: some View {
 		Text("Hello World!")
 	}
 }

์œ„์˜ ์ฝ”๋“œ๋Š” View์™€ ๊ฐ™์ด ํ–‰๋™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ์ด๋‹ค. ContentView๋ผ๋Š” Struct์•ˆ์— ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋“ค์„ ์ž์„ธํžˆ ๋ณด์ž.

View์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” body๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ, body ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด์„œ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์“ฐ์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ View๋“ค์ด ์กฐํ•ฉ๋œ ์ตœ์ข… View๊ฐ€ ์Šคํฌ๋ฆฐ ์ƒ์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ์‚ฐ์˜ ๋ชฉ์ ์œผ๋กœ ์“ฐ์ธ๋‹ค.


some View๋ž€ ๋ฌด์—‡์ผ๊นŒ?

 

๋ณดํ†ต Swift ๋ฌธ๋ฒ•์—์„œ ๋ณ€์ˆ˜ ์˜†์˜ ์ฝœ๋ก  ๋‹ค์Œ์—๋Š” ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๊ธฐ์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ some View๋ผ๋Š” ๊ฒƒ์€ ํƒ€์ž…์ด๋ผ๋Š” ์ด์•ผ๊ธฐ์ธ๋ฐ ์™œ ๊ตณ์ด ์ •ํ™•ํ•œ ํƒ€์ž…์„ ๊ธฐ์žฌํ•˜์ง€ ์•Š๊ณ  ๋ชจํ˜ธํ•˜๊ฒŒ some View๋ผ๊ณ  ํ•ด์•ผ ํ• ๊นŒ?

 

์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. body ๋ณ€์ˆ˜๋Š” ์•ž์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋กœ ํ•˜๋‚˜์˜ ์ตœ์ข…์ ์ธ View๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋Ÿฌํ•œ View๊ฐ€ ์–ด๋– ํ•œ View ํƒ€์ž…์ผ์ง€๋Š” ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ZStack๊ฐ™์ด View Combiner๋‚˜ View Modifier ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์กฐํ•ฉ๋˜๋Š” ๋ณต์žกํ•œ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด์„œ ์—ฐ์‚ฐ๋  ํ…๋ฐ ์ด ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ค View ํƒ€์ž…์ผ์ง€ ์‚ฌ๋žŒ์ด ์ผ์ผ์ด ํŒ๋‹จํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŠน์ •ํ•œ View ํƒ€์ž…์„ ๊ธฐ์žฌํ•˜์ง€ ์•Š๊ณ  some View๋ผ๊ณ  ๊ธฐ์žฌํ•จ์œผ๋กœ์จ ์ผ๋‹จ View ํƒ€์ž… ์ค‘์— ํ•˜๋‚˜์ผ ๊ฒƒ์ด๋ผ๊ณ ๋งŒ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


View Modifier๋ž€?

 

simple View์— color, padding ๊ฐ™์ด ์†์„ฑ์„ ์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ Modifier๋“ค์ด ๋ถ™์€ View๋Š” ์ด์ „๊ณผ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด Modified View๊ฐ€ ๋œ๋‹ค. ์ฆ‰, Modifier๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ ๋ถ™์€ ์ˆœ์„œ๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ์šฉ๋˜๋ฉฐ ์ ์šฉ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด View๊ฐ€ ์ƒ๊ฒจ๋‚œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

View Modifier๋Š” ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


ZStack์ด๋ž€?

 

ZStack์€ View Combiner๋กœ์จ Combining View๋ฅผ ๋งŒ๋“ ๋‹ค. View Builder๋“ค์ด ๋งŒ๋“  ์—ฌ๋Ÿฌ Bag of Views๋“ค์„ ์กฐํ•ฉํ•˜๋Š”๋ฐ ZStack์€ ์ด๊ฒƒ๋“ค์„ Z์ถ• ๊ธฐ์ค€์œผ๋กœ ์กฐํ•ฉํ•œ๋‹ค. 

* View Builder๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” Bag of Views๋“ค์€ tuple Views๋ผ๊ณ  ํ•œ๋‹ค.

 

 ZStack {
 	RoundedRectangle(cornerRadius: 25.0)
		.stroke(lineWidth: 3)
	Text("Hello World!")
 		.foregroundColor(.orange)
 }
 .padding(.horizontal)
 .foregroundColor(.red)

 

์œ„์˜ ์ฝ”๋“œ๋Š” ZStack์˜ ์˜ˆ์‹œ์ด๋‹ค. ๋ˆˆ์—ฌ๊ฒจ ๋ด์•ผํ•  ๊ฒƒ์€ Modifier๋“ค์ด๋‹ค. ZStack ์™ธ๋ถ€์—์„œ ์„ ์–ธ๋œ ๊ฒƒ๋“ค๊ณผ ZStack ๋‚ด๋ถ€ ์ฆ‰, ์•ˆ์— ์žˆ๋Š” View Builder์—์„œ ์„ ์–ธ๋œ ๊ฒƒ๋“ค์ด ์กด์žฌํ•œ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด Modifier๋“ค์€ ์ƒ์†๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ–ˆ๋‹ค.

foregroundColor๋ฅผ ๋ณด๋ฉด ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์™ธ๋ถ€์—์„œ ์ฆ‰ ZStack ์ž์ฒด์—์„œ ์„ ์–ธ๋œ ๊ฒƒ์€ ์ƒ์†์ด ๋˜์–ด ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  View Builder๋“ค์—๊ฒŒ ์ ์šฉ๋œ๋‹ค. ๋˜ํ•œ, ๋‚ด๋ถ€์— ์„ ์–ธ๋œ foregroundColor๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ด์„œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, padding์˜ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅด๋‹ค. padding์˜ ๊ฒฝ์šฐ๋Š” foregroundColor์ฒ˜๋Ÿผ ์™ธ๋ถ€์—์„œ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ ์ƒ์†๋˜์–ด ๋ชจ๋“  View Builder๋“ค์—์„œ ์ ์šฉ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ ๋ณด๋ฉด ZStack ์ž์ฒด์—์„œ๋งŒ ์ ์šฉ๋˜๊ณ  ๋‚ด๋ถ€์˜ Builder๋“ค์—๊ฒ ์ ์šฉ์ด ๋˜์ง€ ์•Š์•˜๋‹ค.

 

์ด์ฒ˜๋Ÿผ, ZStack๊ฐ™์€ View Combiner์— ์ ์šฉ๋˜๋Š” View Modifier๋“ค์—๋Š” 2๊ฐ€์ง€ ์ผ€์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•œ ์ผ€์ด์Šค๋Š” ์ƒ์†์ด ๋˜๋Š”๊ฒƒ, ๋‹ค๋ฅธ ํ•œ ์ผ€์ด์Šค๋Š” ์ƒ์†์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

* ์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์€ ๊ฐ•์˜์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง‘์–ด์ฃผ์‹œ์ง€๋Š” ์•Š์•„์„œ ์ •ํ™•ํ•œ ์ •๋ณด์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค...


1๊ฐ•์„ ๋งˆ์น˜๋ฉฐ...

 

์•„๋ฌด๋ž˜๋„ ์˜์–ด ๊ฐ•์˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ง‰์„ ํ‚ค๋”๋ผ๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ๋ฐ›์•„๋“œ๋ฆฌ๊ธฐ์—๋Š” ํž˜๋“ค์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ SwiftUI์˜ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ€๋ฅด์ณ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทผ๋ณธ์ ์œผ๋กœ ์™œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€๋ฅผ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ฐ€๋ฅด์ณ์ฃผ์…”์„œ ์ •๋ง ์ข‹์•˜๋‹ค! ๋˜ํ•œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•œ Swift์˜ ๊ฐ•๋ ฅํ•จ์„ ์ฒ˜์Œ์œผ๋กœ ์‹ค๊ฐํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๋Œ“๊ธ€