ํฐ์คํ ๋ฆฌ ๋ทฐ
[iOS] - Stanford CS193p iOS ๊ฐ์ 3๊ฐ ์ ๋ฆฌ by Paul Hegarty
B_log 2021. 4. 8. 19:06๐ค Swift ํ๋ก๊ทธ๋๋ฐ ์ธ์ด - Part 1
๐น Concentration Game UI ๋ณ๊ฒฝ
2๊ฐ๊น์ง ์์ฑํ ๊ฒ์์ UI๋ ๊ด์ฐฎ์ ๊ฒ ์ฒ๋ผ ๋ณด์ ๋๋ค. ํ์ง๋ง ํ๋ฉด์ ํ์ ํ๊ฑฐ๋ ๋ค๋ฅธ ๊ธฐ๊ธฐ์์ ์๋์ํค๋ฉด ํ๋ฉด์ด ์ด์ํ๊ฒ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
โ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์ผ์ชฝ ์๋ฅผ ๊ธฐ์ค์ผ๋ก UI๊ฐ ๋ฐฐ์น๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์ Stack View๋ฅผ ํ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ๋ฌถ์ด์ฃผ๊ณ ์ถ์ ์์๋ค์ ๋ธ๋ก์ฒ๋ฆฌํ ํ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
์ด์ 4๊ฐ์ ๋ฒํผ์ด ํ๋์ View์ ๋ด๊ฒผ์ต๋๋ค. Spacing์ standard๋ก ํด์ฃผ๊ณ fill equally ์ต์ ์ ์ค ํ ์๋ ๋์ค์๋ ๊ฐ์ ์์ ์ ์งํํฉ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ๋ก ๊ฐ๋ก๋ก 3์ค์ Stack View๊ฐ ์๊ฒผ์ต๋๋ค. ์ด Stack View๋ฅผ ๋ฌถ์ด ํ๋์ Stack View์ ๋ค์ ๋ด๊ฒ ์ต๋๋ค.
์ ์ฒด๋ฅผ ๋ด์ Stack View๋ฅผ ์ฌ๋ฐ๋ฅธ ์์น์ ๊ณ ์ ์์ผ๋ณด๊ฒ ์ต๋๋ค. View์ ์กด์ฌํ๋ ๋ฒํผ์์ Controller์ target์ ๋ง๋ค์ด ์ค ๋ ํ๋ ๊ฒ์ฒ๋ผ Ctrl์ ๋๋ฅธ ์ํ์์ ๋๋๊ทธ๋ฅผ ํ๋ฉด View์์๋ ๊ด๊ณ๋ฅผ ํ์ฑํ ์ ์์ต๋๋ค.
Top Sace to Safe Area ์ต์ ์ ์ ํํด๋ณด๊ฒ ์ต๋๋ค.
๋ณด์กฐ์ ์ด ๋ ์๋ณด์ด๊ฒ ํ๊ธฐ ์ํด์ ๋ฐฐ๊ฒฝ์ ํ์์์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ์์ ๋๋ฌธ์ I ๊ฐ์ ๋ชจ์์ ๊ท์ฝ์ด ์์ฑ๋์์ต๋๋ค. ์ด์ ๋ค๋ฅธ ๋ฐฉํฅ๋ ์ด๋ฌํ ์ต์ ์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
์ข, ์ฐ, ์์ ๊ฐ์ ๊ท์ฝ์ ์ฃผ๊ณ constraint๋ก ์ข ์ฐ์ ๊ฐ์ ์ซ์๋ฅผ ์ ๋ ฅํ ๊ฒฐ๊ณผ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์๋ฆฌ๋ฅผ ์ก์์ต๋๋ค. ์ด์ ์๋ ๋ฐฉํฅ์ด ๋ฌธ์ ์ธ๋ฐ Flips๊ฐ ๋ณด์ด๋ label์ด ์์ผ๋ฏ๋ก ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก Flips label์ ๋ฐ๋ฅ๊ณผ contraint๋ฅผ ์ฃผ๊ฒ ์ต๋๋ค.
ํ์ง๋ง ์์ ๊ฒฝ์ฐ์ ๋ค๋ฅด๊ฒ ๋นจ๊ฐ์ค์ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ ๋ ์ label์ ํฌ๊ธฐ๊ฐ ๊ท์ ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ bottom๊ณผ์ constraint๊ฐ label์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋์ ์ถ๊ฐ์ ์ผ๋ก ์ต์ ์ ์ฃผ๋๋ฐ ๊ธฐ์กด๊ณผ ๋ค๋ฅด๊ฒ Auto fixing์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
ํด๋ฆญํ๋ฉด
์ฒ๋ผ ๋ฉ์ธ์ง๊ฐ ๋์ค๊ณ Add Missing Constraints๋ฅผ ํตํด ์๋์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ํ ์ ์์ต๋๋ค. ์๋์ ์๋ Localization Issue์ ๊ฒฝ๊ณ ์ญ์ ํด๊ฒฐ ๊ฐ๋ฅํ๋ฐ ํด๋ฆญํ๋ฉด
์ ๋ฉ์ธ์ง๊ฐ ๋จ๊ณ Fix ๋ฒํผ์ ํตํด ๊ฒฝ๊ณ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ด๋ฒ์ Flips label๊ณผ Stack View์ ์์น๋ฅผ ์ค์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ์กด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Ctrl + ๋๋๊ทธ๋ฅผ ํตํด ๋ ์์์ ๊ด๊ณ๋ฅผ ์ค์ ํด์ค๋๋ค. vertical spacing์ ํตํด ์์ง์ ์์น๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ด๊ณ๋ฅผ Equal์ด ์๋ Greater Than or Equal๋ก ์ค์ ํด์ค๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฌด์กฐ๊ฑด Stack View๊ฐ Flips Label ์์ ์์นํ๋ ๊ตฌ์กฐ๊ฐ ๋ฉ๋๋ค. ํ์ง๋ง ๋ฐ๋ก ์์ ์์ ํ์๋ ์๊ฒ ๋ฉ๋๋ค. ์ด์ UI๊ฐ ๋ค๋ฅธ ๊ธฐ๊ธฐ์์๋ ๋ฌธ์ ์์ด ์๋ํฉ๋๋ค.
๐ Access Control
- ๊ฐ์ฒด์งํฅ์ ๊ฐ๋ฐ์ ํ ๋์ ์ค์ํ ๊ฒ์ด ์ ๊ทผ ์ ์ด(Access Control)์
๋๋ค. ์ด๋ค ์์๋ ๊ทธ ์์๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด ์์์๋ง ์ฌ์ฉ๋๊ณ , ์ด๋ค ์์๋ ๋ค๋ฅธ ๊ฐ์ฒด์์ ๋ฐ๋์ ํ์ํ ์๋ ์์ต๋๋ค. ๋ฌธ์ ๋ ๋ชจ๋ ์์๋ค์ ์๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค๋ฉด ์๋ํ๋ฅผ ์งํค๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ฐ๋
์ ์ธ ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ๊ตฌ์กฐ์ ์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์์๋ง๋ค ์ด๋ ์ ๋์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง ์ ์ํ๋ ๊ฒ์ด ์ ๊ทผ ์ ์ด ์
๋๋ค. ์๋๋ Swift ์ ๊ทผ ์ ์ด ํค์๋์
๋๋ค.
- internal: default๋ก app๋ framework ๋ด์์ ๋๊ตฌ๋ ์ด object์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ฆ unlimited usability๋ฅผ ๊ฐ์ง๋๋ค.(usable by anhy object in my app or framework)
- private: ์ด object ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.(only callable from within this object)
- private(set): ๊ธฐ๋ณธ์ ์ผ๋ก object ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง(get, set) ๊ฐ์ ธ์ค๋ ์์ (get)์ object ์ธ๋ถ์์๋ ๊ฐ๋ฅํฉ๋๋ค.(readable only outside of object)
- fileprivate: ํด๋น ํ์ผ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.(accessible by any code in this source file)
- public/open: ์ด๊ฒ์ framework writers๋ฅผ ์ํ ๊ฒ์ ๋๋ค. public์ framework ์ธ๋ถ ์ฌ์ฉ์๊ฐ ๋ถ๋ฌ์ฌ ์ ์๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ open์ public์์ ๋ ๋์๊ฐ์ subclass, override ๋ฑ ๋ชจ๋ ๊ฒ์ ํ ์ ์์ต๋๋ค.
๐ Assertion(๋จ์ธ๋ฌธ)
๋จ์ธ๋ฌธ์ ์ด๋ค ๊ฒ์ด ์ฐธ์์ ๋จ์ธํ๋ ํจ์์ ๋๋ค. assert ๋ฉ์๋๋ฅผ ํตํด ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ(false์ ๊ฒฝ์ฐ) ํน์ ๋ฉ์ธ์ง๊ฐ ์ถ๋ ฅ๋๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์๋๋ chooseCard ๋ฉ์๋์ ๋๋ค.
func chooseCard(at index: Int) { assert(cards.indices.contains(index), "Concentration.chooseCard(at:\(index)): chosen index not in the cards") if !cards[index].isMatched { if let matchIndex = indexOfOneAndOnlyFaceUpCard, matchIndex != index { if cards[matchIndex].identifier == cards[index].identifier { cards[matchIndex].isMatched = true ...
assert ๋ฉ์๋๋ฅผ ์ค๊ฐ์ ์ฝ์ ํ์ฌ ํ์ธํ ์ ์์ต๋๋ค. cards.indices๋ cards๊ฐ ๊ฐ์ง index์ sequence์ด๋ฉฐ ์ด๊ฒ์ ๋ฒ์์ ํฌํจ๋์ง ์๋ index์ผ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์ ๋ฉ์ธ์ง์ index ๋ด์ฉ์ ํ์ํด์ค๋๋ค. ์ฆ, ์ผ์ชฝ์๋ Bool ๊ฐ์ ํตํด ํ๋ณํ๊ณ ์ค๋ฅธ์ชฝ์ ํ์ธํ๋ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅ์ํต๋๋ค.
๐ Mutating
- Swift์ Value type์ Copy on write์ ๊ธฐ๋ณธ์ผ๋ก ํฉ๋๋ค. ์ฆ, ๋ณต์ ๋์ ์ด๋ ๋ ๋ ๋ฌด์กฐ๊ฑด ๋ณต์ฌํ๋ ๊ฒ์ด ์๋๋ผ ๋ณ๊ฒฝ๋ ๋ ์ค์ ๋ณต์ฌ๊ฐ ์งํ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๋ค ๋ฉ์๋์์ ์ค์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์ ์๋์ง ๋ช ์ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ด mutating์ ๋ถ์ด๋ ์ด์ ์ ๋๋ค. Enum์์ ๊ฐ์ ๋ณ๊ฒฝ์์ผ์ค ๋ ๋ฉ์๋๋ฅผ ํตํ ๋ฐฉ๋ฒ ๋ฐ์ ์๊ณ ์ด ๋ mutating func์ ์ด์ฉํฉ๋๋ค.
Reference: Stanford CS193p by Paul Hegarty
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] - Stanford CS193p iOS ๊ฐ์ 6๊ฐ ์ ๋ฆฌ by Paul Hegarty (0) | 2021.04.18 |
---|---|
[iOS] - Table View & Collection View (ํ ์ด๋ธ ๋ทฐ, ์ปฌ๋ ์ ๋ทฐ) (0) | 2021.04.13 |
[iOS] - Control Event(์ปจํธ๋กค ์ด๋ฒคํธ) (0) | 2021.04.06 |
[iOS] - Stanford CS193p iOS ๊ฐ์ 2๊ฐ ์ ๋ฆฌ by Paul Hegarty (0) | 2021.04.05 |
[iOS] - Stanford CS193p iOS ๊ฐ์ 1๊ฐ ์ ๋ฆฌ by Paul Hegarty (0) | 2021.04.02 |
- Total
- Today
- Yesterday
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- django#slicing
- django
- filter#isalnum#lower
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- NumberofDiscIntersections#Codility#Sort#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ์์ด์ฌ์ดํด#BOJ#Python
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- Brackets#Stacks and Queues#Codility#Python
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- Distinct#Codility#Python
- Swift#Tuples#Range
- API#lazy#
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- Triangle#Sorting#Codility#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- PassingCars#Codility#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 | 31 |