ํฐ์คํ ๋ฆฌ ๋ทฐ
[iOS] - Stanford CS193p iOS ๊ฐ์ 1๊ฐ ์ ๋ฆฌ by Paul Hegarty
B_log 2021. 4. 2. 23:31๐ฑ [์คํ ํฌ๋] iOS ๊ฐ์ ํ์ตํ๊ธฐ (CS193p by Paul Hegarty in Stanford)
- ์คํ ํฌ๋์ Paul Hegarty ๊ต์๋๊ป์ ์งํํ์ CS193p ๊ฐ์๋ฅผ ํตํด iOS์ ๋ํ ์ ๋ฐ์ ์ธ ๊ธฐ์ด๋ฅผ ์์๋ณด๊ณ ์ ํฉ๋๋ค. ๋ธ๋ก๊ทธ์๋ ๊ฐ์ ๋จ์๋ก ์ ๋ก๋ํ ๊ณํ์ ๋๋ค. ๋จ์ํ ๊ฐ์ ๋ด์ฉ์ ํ๊ธฐํ๋ ๋ธ๋ก๊น ์ด ์๋๋ผ ์ถ๊ฐ์ ์ธ ์๋ฃ ์กฐ์ฌ๋ ๋ค๋ฅธ ๊ฐ์ ๋ด์ฉ์์ ์ต๋ํ ๋ด์ฉ์ ์ถ๊ฐํ๋ ํ์์ ๋ธ๋ก๊ทธ๊ฐ ๋ ์์ ์ ๋๋ค.
๐ฏ Lecture.01 Introduction
- iOS์ ๋ํ ์ ๋ฐ์ ์ธ ์ค๋ช ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ํ ๊ฐ๋จํ ์ค๋ช ์ ์งํํฉ๋๋ค.
- ์ค์ตํด๋ณธ git Repository
๐ Swift ์ธ์ด์ ํน์ง
- Swift๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object Oriented Prograaming)์ด ๊ฐ๋ฅํ์ง๋ง ํจ์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Function Oriented Programming), ํ๋กํ ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Protocol Oriented Programming) ์ญ์ ๊ฐ๋ฅํฉ๋๋ค.
๐ iOS์ ๊ตฌ์กฐ
iOS๋ ํฌ๊ฒ 4๊ฐ์ง์ ๊ตฌ์กฐ๋ก ๋์ด์์ต๋๋ค.
Cocoa Touch
Media
Core Services
Core OS
์๋๋ก ๊ฐ์๋ก ์์คํ ์ ๊ฐ๊น๊ณ ์๋ก ์ฌ๋ผ๊ฐ์๋ก ์ฌ์ฉ์์ ๊ฐ๊น์ต๋๋ค.
Core OS:
iOS์ Core OS๋ BSD ๊ณ์ด Unix๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ๊ทธ๋์ ๊ทธ ์์ ์ผ์ด๋๋ ๋ชจ๋ ์ผ๋ค์ C์ธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
Core Services:
์ด ์ธต์ ์๋์ ํ์ ์๋น์ค๋ค์ ์ต์์์ ์๋ ๊ฐ์ฒด ์งํฅ ์ธต์ ๋๋ค.
์ค๋งํธํฐ์ ํ์ฌ ์์น ๋ฐฉํฅ์ ์ฐพ๊ณ ์์คํ ํ์ผ์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ์ด Core Service๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Media:
์์ดํฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ดํ์ ์ ํ ๊ธฐ๋ฅ์ ๋ฃ์ ๊ฒ์ ๋๋ค. ๊ทธ๋์ Media๋ฅผ ๋ค๋ฃจ๋ ๊ณ์ธต์ด ์กด์ฌํฉ๋๋ค.
Cocoa Touch:
์ด ๊ณ์ธต์ iOS์ UI ์ธต(Layer) ์ ๋๋ค. ๋ฒํผ๊ณผ ์ฌ๋ผ์ด๋ ๊ฐ์ UI ์์๋ค์ด ์์ต๋๋ค.
๐ Design Strategy
- ๊ต์๋์ ๊ธฐ์กด ์์ ์์๋ MVC(Model-View-Controller)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ํ์ จ์ต๋๋ค. ๋์์ธ ์ ๋ต์ ์ต์ ์ด ์๋๋ผ ๋ฐ๋์ ์ง์ผ์ผํ๋ ๊ท์ ์ ๊ฐ๊น์ต๋๋ค. ํ์ง๋ง 2020๋ Spring ์์ ๊ธฐ์ค์ผ๋ก MVVM(Model-View-ViewModel)์ ๊ฐ์ํด์ฃผ์ญ๋๋ค. ์์ ์์ MVC๋ฅผ "the old-style iOS development mechanism uses"(์์ ์ ์ฌ์ฉ๋ iOS ๊ฐ๋ฐ ์คํ์ผ)๋ก ๊ท์ ํ์ ์ MVVM์ ๊ฐ์ํ์์ง๋ง ํ์ต์์ ์ ์ฅ์์ iOS ์ํ๊ณ์์ ์ฌ์ฉ๋๋ MVC์ MVVM์ ๋ชจ๋ ์๊ณ ์ถ์ด ๋ ๋ด์ฉ ๋ค ํ์ตํ ์์ ์ ๋๋ค.
๐ด ์ง ๋ง์ถ๊ธฐ ๊ฒ์ ๋ง๋ค๊ธฐ(Making Concentration Game)
์ง ๋ง์ถ๊ธฐ ๊ฒ์์ ๋ง๋ค๊ธฐ ์ํด ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ฌ๋ฌ๊ฐ์ ํ์ผ์ด ์์ง๋ง ์ฌ๊ธฐ์๋ 2๊ฐ์ ํ์ผ๋ง ์ดํด๋ด ๋๋ค. ์๋ฅผ ๋ค์ด, Assets ํด๋๋ ์ฑ์ ์์ด์ฝ ์ด๋ฏธ์ง๋ฅผ ํฌํจํด์ ์์ง ์ค์ ํ์ง ์์ ์ด๋ฏธ์ง๋ค์ ๋ชจ์์ ๋๋ค. ๊ทธ๋์ ์์ง ํ์ํ์ง ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก AppDelegate๋ LaunchScreen ์ญ์ ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋์ ํ์์๋ ํ์ผ๋ค์ ๋ธ๋ญ์ง์ ํด ์ฐํด๋ฆญ์ ํ๋ฉด ์๋์ ๊ฐ์ ์ต์ ์ด ๋์ต๋๋ค.
๋นจ๊ฐ ๋ฐ์ค์ ์ต์ ์ ํด๋ฆญํ๋ฉด ์๋์ ์ผ๋ก ํ๋์ Folder์์ ๋ฌถ์ด์ฃผ๊ณ ๊ทธ ์ด๋ฆ์ Supporting Files๋ก ์ง์ ํ์ต๋๋ค.
Main.storyboard์ ๋ค์ด๊ฐ๋ฉด ์ง์ ํ๋ฉด์ ๊ทธ๋ฆด ์ ์๊ณ , ๊ทธ๋ฆฐ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธ ํ ์ ์์ต๋๋ค. ์ ๋ชฐ๋๋ ๋ถ๋ถ์ ์๋์ Appearance ์์ต๋๋ค.
Device: ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๊ธฐ๊ธฐ์ ์ข ๋ฅ(e.g. iPad Pro, iPhone 12 etc)
Appearance: Dark/Light Mode์์ ๊ฒฐ๊ณผ๋ฌผ ์ถ๋ ฅ
Orientation: ๊ฐ๋ก/์ธ๋ก ๋ชจ๋
๋คํฌ๋ชจ๋๊ฐ ๋์ค๊ธฐ ์ (iOS 13 ์ด์ )์๋ ํด๋น ์ ํ์ง๊ฐ ์์ ์์๊ณ ์ฒ์ ๋์์ ๋์๋ Xcode์์ Interface Style๋ก ํ๊ธฐํ์์ต๋๋ค.
์คํ ๋ฆฌ๋ณด๋์ Button์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
Button์ ์๊น์ ๋ฐ๊พธ๋ ๋ฑ Button์ ํน์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ Utility's Pane์์ ์ค์ ์ ๋ณ๊ฒฝํฉ๋๋ค. ์์ฑ ๋ณ๊ฒฝ์ ์ํ UI์ธ Utility's Pane์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๊ตฌํ ๋์ด์์ต๋๋ค.
์๋ ํ๋์ ๋ฐ์ค์๋ Control Pane์ด ๋ณด์ด๋๋ฐ, ๋ฒํผ์ Control์ ์์๋ฐ๊ธฐ ๋๋ฌธ์ Control Pane์ด ์กด์ฌํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ํด Control Pane ์๋์๋ View Pane์ด ์กด์ฌํฉ๋๋ค.
Control์ View๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ Button์ View UI๊ฐ ๋ํ๋ฉ๋๋ค. ์ด๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๋ณด๋ฉด
class Button: Control class Control: View
๋ก ํํ ๊ฐ๋ฅํฉ๋๋ค.
๊ตฌํ์ด ์๋ฃ๋ ์ด๋ฏธ์ง์ ๋์์ ์ค์ ํด์ฃผ๊ธฐ ์ํด์๋ Swift์ ์ฝ๋์ ์ฐ๊ฒฐํด์ผํฉ๋๋ค. ์ด๋ฅผ ์ํด ViewController ํ์ผ์ ์ด์ด๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ธํ ๋์ด์๋ ์ฝ๋๋ ์ด๋ฒ ํ๋ก์ ํธ์์ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ญ์ ํ์ต๋๋ค.
- UIKit: Button, Slider ๋ฑ UI์ ๊ด๋ จ๋ ์์ค๋ค์ด ์๋ iOS ํ๋ ์์ํฌ์ ๋๋ค.
- ViewController: ์ด ํด๋์ค์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ฌ๊ธฐ๋ง ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ UI์ ์๋ ์์๋ค์ ์ด๋ฆ๋ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๊พธ์ง ์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. ๋ํ ์ด ํด๋์ค๋ UIViewController๋ฅผ ์์๋ฐ๋ subclass์ ๋๋ค.
storyboard์์ ์์๋ฅผ ํด๋ฆญํ ํ control์ ๋๋ฅธ ์ํ๋ก ์ฝ๋์ ๊ฐ์ ธ๊ฐ๋ฉด ๋ฐ๋ก ์ฐ๊ฒฐ๋๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Swift๊ฐ ๋ค๋ฅธ ์ธ์ด๋ค๊ณผ ๋ค๋ฅธ ํน์ง
- ๋ชจ๋ ์ธ์์ ์ด๋ฆ์ด ์์ต๋๋ค(every argument has a name). ๋ฉ์๋๋ฅผ ๋ถ๋ฅผ ๋ ์ด ์ด๋ฆ์ ํฌํจํด์ผ ํฉ๋๋ค.
- ์ธ์๋ค์ด 2๊ฐ์ ์ด๋ฆ์ ๊ฐ์ต๋๋ค. ํ๋๋ ํธ์ถ์ ์ฌ์ฉํ๋ ์ธ๋ถ(external) ์ด๋ฆ์ด๊ณ , ํ๋๋ ๋ก์ง ๋ด๋ถ์์ ๊ตฌํ์ ์ฌ์ฉํ ๋ด๋ถ(internal) ์ด๋ฆ์ ๋๋ค.
์ฐ๊ฒฐ์ด ๋์๋์ง ํ์ธํด๋ณด๊ธฐ ์ํด ์ฝ๋ ์์ ์ฝ์์ ์ถ๋ ฅ์ด ๋ ๋ฉ์ธ์ง๋ฅผ ๋ฃ์ต๋๋ค.
UIButton์ธ ์ค๋ฅธ์ชฝ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํจ์ touchCard์ parameter๋ก ๊ทธ ์ ๋ ฅ์ด ๋ค์ด๊ฐ๊ฒ๋๊ณ ํจ์๋ฅผ ์คํ์์ผ์ค๋๋ค. ์ด์ ์ฝ์์ ์ถ๋ ฅ๋ฌธ์ ์ง์ฐ๊ณ ์นด๋๋ฅผ ๋ค์ง์ด์ค ํจ์๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
ํจ์๋ฅผ ๋ง๋ค ๋, ๋ค์ด๋ฐ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ "์์ด์ฒ๋ผ ์ฝํ๋ ๊ฒ" ์ ๋๋ค. flipCard๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์์ต๋๋ค.
ํจ์ flipCard์ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๋ณ์ ๋ช ์ emoji์ button์ด๊ณ , ์ด ํจ์๋ฅผ ํธ์ถํ ๋ ์ ๋ ฅ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ withEmoji, on ์ ๋๋ค. ์ด๋ฅผ ํตํด flipCard withEmoji "ghost" on sender๋ผ๋ ์์ด๋ฌธ์ฅ์ผ๋ก ์ฝํ ์ ์๋ ์ฝ๋ ๋ค์ด๋ฐ์ด ์์ฑ ๋์์ต๋๋ค. ๋ค๋ง touchCard์ ํ๋ผ๋ฏธํฐ๋ sender ์์ under bar(_)๊ฐ ๋ถ์ด์๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ์ด๋ ์ธ๋ถ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๋๋ค. Swift์์๋ ์ด๋ ๊ฒ ๋ณ์๋ช ์ ์๋ตํด์ฃผ๋ ๊ฒฝ์ฐ๋ ํ์น ์์๋ฐ, ๊ทธ ์ด์ ๋ ์ด๋ฌํ ๋ก์ง์ด Objective-C์์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ํจ์๋ iOS์์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ธ๋ฐ ์ด๊ฒ์ Objective-C์์ ์๊ณ Objective-C๋ ๋ด๋ถ/์ธ๋ถ ์ด๋ฆ์ ๊ฐ๋ ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. flipCard ๋ฉ์๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
์ฒซ๋ฒ์งธ ์กฐ๊ฑด์ ์ ๋ฒํผ์ ํ์ฌ ํ์ดํ์ด ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด๋ผ๋ฉด ๋ฒํผ์ ๋น์ด์๊ฒ ๋ง๋ค์ด์ค๋๋ค. ์ด ๋, setTitle ์์ for์ ๊ฐ์ผ๋ก ๋ฃ์ด์ฃผ๋ UIControl์ด ์ง๊ธ์ UIControl.State.normal์ด์ง๋ง ์์ ๊ธฐ์ค์ผ๋ก๋ UIControlState.normal์ด์์ต๋๋ค. ์๋ง State๋ฅผ ํ๋กํผํฐ ๋ฑ์ผ๋ก ๋ค์ ์ ์ธํด์ฃผ๋ ๊ตฌ์กฐ๋ก ๋ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ์ else ๊ตฌ๋ฌธ์ ๋ฐ๋๋ก ํ์ฌ ๋ฒํผ์ด ํด๋น ์ด๋ชจ์ง๊ฐ ์๋ ๋ ์ด๋ชจ์ง๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ๋ฐฐ๊ฒฝ ์๊น์ ๋ฐ๊ฟ ๋ ์ค๋ฅธ์ชฝ์ ๋ณด์ด๋ ์๊น ๋ฐ์ค๋ Color Literal๋ก ๋ฐ๋ก ์๊น์ ์ง์ ํด ์ค ์ ์์ต๋๋ค.
์ด์ ์ถ๊ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ทธ๋ฆผ์ ์นด๋๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
ํธ๋ฐ ๊ทธ๋ฆผ์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ก ์ถ๊ฐํ ํ, touchSecondCard๋ผ๋ ๋ฉ์๋๋ฅผ ์์ฑํ์ต๋๋ค. ์ ๋ น ๊ทธ๋ฆผ์ ์ฌ์ ํ ์ ์๋ํ์ง๋ง ํธ๋ฐ ๊ทธ๋ฆผ์ ์ ๋๋ก ๋์ํ์ง ์์ต๋๋ค. ์๊ทธ๋ฐ์ง ์ดํด๋ณด๊ธฐ ์ํด, 22๋ฒ์งธ์ค์ print๊ตฌ๋ฌธ์ ๋ฃ์ด emoji๋ฅผ ์ถ๋ ฅํด๋ณด์์ต๋๋ค. ์ด ๋ ํธ๋ฐ ์นด๋๋ฅผ ๋๋ฅด๋ฉด ํธ๋ฐ ์ด๋ชจ์ง๋ ์ ์ถ๋ ฅ์ด ๋์ง๋ง ๊ฑฐ๊ธฐ์ ๋ํด ๋๋ฅธ์ ์๋ ์ ๋ น ์ด๋ชจ์ง๋ ๊ฐ์ด ์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์๋๋ ํธ๋ฐ ์นด๋๋ฅผ 2๋ฒ ๋๋ ์ ๋ ์ถ๋ ฅ์ ๋๋ค.
์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ด์ ๋ ํธ๋ฐ ์นด๋๋ฅผ ์์ฑํ ๋ ์ ๋ น ์นด๋๋ฅผ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋ น์ ๋ณต์ฌํ ๋ ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค๋ ์ฌ์ค ์ญ์ ๋ณต์ฌ๋ ๊ฒ์ ๋๋ค. ์ด๋ด ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ง์ฐ์ค ์ฐํด๋ฆญ์ ๋๋ค. ํธ๋ฐ ๊ทธ๋ฆผ์ ๋ง์ฐ์ค ์ฐํด๋ฆญ์ ํ๋ฉด ์๋์ ๊ฐ์ด ๋ํ๋ฉ๋๋ค.
Touch Up Inside๋ฅผ ๋ณด๋ฉด ๋ ๋ฉ์๋ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ x๋ฒํผ์ผ๋ก touchCard๋ง ์ญ์ ํ๋ฉด ์ ์์ ์ผ๋ก touchSecondCard๋ง ์๋ํ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก๋ ์นด๋๋ฅผ ๋ช๋ฒ ๋ค์ง์๋์ง ์ซ์๋ฅผ ์นด์ดํธํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์นด๋ ๋ค์ง๊ธฐ ๊ฒ์์ ์นด๋๋ฅผ ์ ๊ฒ ๋ค์ง์ ์๋ก ๋์ ์ ์๋ฅผ ๋ฐ๋ ๊ฒ์์ ๋๋ค. ์ซ์๋ฅผ ์นด์ดํธํ๊ธฐ ์ํด ์ธ์คํด์ค ๋ณ์๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ณ์๋ฅผ ์์ฑํ ๋ค, ์ด๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ค Label์ ๋ง๋ค๊ณ ์๊น์ ๊ฐ์ด ์ปจํธ๋กค ํค๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์ด ๋ ์์์ ๋ฉ์๋๊ฐ ํ์ํด์ Action์ผ๋ก ์ฐ๊ฒฐํด์ค ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ Outlet์ด๋ผ๋ ๊ธฐ๋ฅ์ผ๋ก ์ฐ๊ฒฐํ๋๋ฐ, ์์ธ๋ ์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๋ง๋ญ๋๋ค.
Swift์์๋ ๋๋ํ(!)๊ฐ ๋ถ์ผ๋ฉด side effect๊ฐ ์๋๋ฐ ์ด๊ธฐํํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์์ flipCount๋ 0์ผ๋ก ์ด๊ธฐํ ํ์ง ์์ผ๋ฉด init Error๊ฐ ๋ฐ์ํ์ง๋ง flipCountLabel์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด์ flipCount๊ฐ ๋ฐ๋๋๋ง๋ค flipCountLabel์ด ์ถ๋ ฅํ๋ ๊ฐ์ ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ผํฉ๋๋ค.
์์ ๊ตฌํ์ ์ ์์ ์ผ๋ก ์ ์๋ํฉ๋๋ค. ํ์ง๋ง ์ ๋ฐ์์ผ๋ก ๊ตฌํํ๊ฒ๋๋ฉด ๊ฐ ๋ฉ์๋๋ง๋ค ๊ฐ์ ๊ตฌ๋ฌธ์ ๋ฐ๋ณตํด์ ๋ฃ์ด์ฃผ์ด์ผ ํฉ๋๋ค. ํน์ flipCount์ ๋ณํ๋ฅผ ์ฃผ๊ฑฐ๋ text์ ๋ค์ด๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ณ๊ฒฝํ๋ refactoring์ด ์๋ค๋ฉด ๋ชจ๋ ๋ฉ์๋์ ์ ๊ทผํด์ผํฉ๋๋ค. ์ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด didSet ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ฌํ didSet์ Property Observer๋ผ๊ณ ํฉ๋๋ค.
Swift๋ ๊ฐํ ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ํ์คํ๋ค๋ฉด ํ์ ์ ๋ช ์ํด์ฃผ์ง ์๋ ์์ค์ด ์๋๋ผ ์ฐ์ง ๋ง์์ผ ํฉ๋๋ค.
์ฝ๋๋ฅผ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ๋๋ค๋ ๊ฒ์ ๋ญ๊ฐ๋ฅผ ์๋ชปํ๊ณ ์๋ค๋ ๋ป์ ๋๋ค.. ์ด๋ด ๊ฒฝ์ฐ fixํ ํ์๊ฐ ์์ต๋๋ค!
์ด์ ๊ธฐ๋ฅ์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ํ์ง๋ง ์ด๋ฐ ๊ตฌ์กฐ๋ก ๋ชจ๋ ์นด๋๋ฅผ ์์ฑํ๋ค๋ฉด ์นด๋๊ฐ ์๊ธธ๋๋ง๋ค ๋น์ทํ ํ์์ ๋ฉ์๋๊ฐ ๊ณ์ ๋์ด๋ฉ๋๋ค. ๊ทธ๋์ ํ๋์ ๋ฉ์๋์ ๋ชจ๋ ์นด๋๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค.
์์ ํจ์์์ ์ ์ผํ๊ฒ ๋ณํ๋ ๋ถ๋ถ์ flipCard ๋ฉ์๋๋ฅผ ํธ์ถ ํ ๋ withEmoji์ ๋ค์ด๊ฐ๋ String ๊ฐ์ด๊ณ ์ด๋ฅผ ํ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด Array๋ฅผ ์ฌ์ฉํฉ๋๋ค. Array์ ๋ชจ๋ ์ด๋ชจ์ง๋ฅผ ๋ฃ์ด ๋๊ณ ๊ด๋ฆฌํ๋ฉด Data-Driven ๊ตฌ์กฐ๋ก ์์ฑํ ์ ์์ต๋๋ค. ๋ค์ ํ๋ฒ ์นด๋๋ฅผ ์ฝ๋์ ์ฐ๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ์๋ Outlet์ด ์๋ Outlet Collection์ ์ฌ์ฉํฉ๋๋ค. Outlet Collection์ UI์ ์๋ ๊ฒ๋ค์ ๋ฐฐ์ด์ ๋๋ค.
๊ฐ์์์๋ cardButtons.index(of:)๋ฅผ ์ฌ์ฉํ์์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ์ค๋ฅ ๋ฉ์ธ์ง๊ฐ ๋น๋๋ค. firstIndex๋ก ๋ฐ๊พธ๋ผ๋ ๋ฉ์ธ์ง๊ฐ ๋์ ๋ณ๊ฒฝํ์ต๋๋ค.
์์ ๊ทธ๋ฆผ์์ 2๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์์ ์ค๋ฅ๋ cardNumber๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก let์ผ๋ก ๋ฐ๊พธ๋ผ๋ ๋ง์ ๋๋ค. ์ ๋ค๋ฅธ ์ธ์ด์ฒ๋ผ ์์๋ฅผ const๋ก ํํํ์ง ์์๊น์? ์ด๊ฒ์ Swift์์ ์ฝ๋๋ ์์ด์ฒ๋ผ ์ฝํ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. const cardNumber๋ ์์ด๋ก ์ฝํ์ง ์์ต๋๋ค!
๋ชจ๋ ์นด๋๋ฅผ ์ฐ๊ฒฐํด์ฃผ๊ณ Array๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด ์ ์ ์๋ํ๊ฒ๋ฉ๋๋ค.
ํ์ง๋ง ์์ ๊ตฌ์กฐ๋ ๋ถ์์ ํ(fragile) ๊ตฌ์กฐ์ ๋๋ค. ์ด๋ชจํฐ์ฝ์ ๊ฐ์๋ UI์ ์๋ ๋ฒํผ๊ณผ ์ ํํ ์ผ์นํด์ผํ๊ณ ๋๊ฐ์ ๊ฒ์ ๋๋ฒ์ฉ ๋ฃ์ด์ฃผ์ด์ผํฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด MVC ๋ชจ๋ธ์ ํตํด ์ด ๊ตฌ์กฐ๋ฅผ ๋ฐ์ ์ํฌ ํ์๊ฐ ์์ต๋๋ค.
Reference: [Stanford CS193p by Paul Hegarty](
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] - Table View & Collection View (ํ ์ด๋ธ ๋ทฐ, ์ปฌ๋ ์ ๋ทฐ) (0) | 2021.04.13 |
---|---|
[iOS] - Stanford CS193p iOS ๊ฐ์ 3๊ฐ ์ ๋ฆฌ by Paul Hegarty (0) | 2021.04.08 |
[iOS] - Control Event(์ปจํธ๋กค ์ด๋ฒคํธ) (0) | 2021.04.06 |
[iOS] - Stanford CS193p iOS ๊ฐ์ 2๊ฐ ์ ๋ฆฌ by Paul Hegarty (0) | 2021.04.05 |
[iOS] - Anatomy of a Constraint in Auto Layout (0) | 2021.03.31 |
- Total
- Today
- Yesterday
- PassingCars#Codility#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- Triangle#Sorting#Codility#Python
- Swift#Tuples#Range
- django
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- django#slicing
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ์์ด์ฌ์ดํด#BOJ#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- API#lazy#
- Brackets#Stacks and Queues#Codility#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- filter#isalnum#lower
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- Distinct#Codility#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |