04 Dec 2017
|
swift
feedback
ios
์ขํ๊ณ์ฐ๊ธฐ ๋ฆฌ๋ทฐ
- ๋ฏธ์
์งํ ๊ธฐ๊ฐ : 2017.11.16 ~ 2017.12.04
- ์ขํ๊ฐ์ ์
๋ ฅ๋ฐ์ผ๋ฉด 4์ฌ๋ถ๋ฉด ์์ ์
๋ ฅ๋ฐ์ ์ขํ๊ฐ์ ์ถ๋ ฅํ๊ณ , ์ขํ๊ฐ์ ์ํด ํ์๋ ๋ํ์ ๊ธธ์ด๋ ๋์ด๋ฅผ ๊ณ์ฐํ์ฌ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ
- ์ขํ๊ณ์ฐ๊ธฐ ๋ฏธ์
github ์ ์ฅ์ ๋ฐ๋ก๊ฐ๊ธฐ
๋ฐฐ์ด ๊ฒ
ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค. (+ ํ๋กํ ์ฝ ์ปดํฌ์ง์
)
์ด๋ก ๋ง ๋ค์์๋๋ ์ด๋ ค์ด ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ฌ์ฉํ๊ณ ๋ณด๋ ์คํ๋ ค ํ๋กํ ์ฝ๋ก ์ธํด ๋ ์ฝ๊ฒ ๊ตฌํ๋๋๊ฒ ๋ง์๋ค.
์ถ์ํ : ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ ๋ฉ์๋์์ ์ฌ์ฉํด์ผํ ๋ ๋ด๋ถ์์ ํ๋์ ์ด๋ฆ, ํ๋์ ํ์
์ผ๋ก ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ ์๋ค๋๊ฒ ๊ฐ์ฅ ์ ์ฉํ๋ค. ๋ง์ฝ ์ด๋ ๊ฒ ํ๋์ ํ๋กํ ์ฝ๋ก ๋ฌถ์ง ์์์ผ๋ฉด ๊ฐ ๊ฐ์ฒด๋ ํ๋์ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด๊ฐ๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๊ธฐ ์ํด์ ํ์ ์ด์์ผ๋ก ๊ณผ๋ํ๊ฒ ๋ง์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋๋ก ์ค๊ณํ๊ฑฐ๋ ๋ค์ํ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํด์ผํ๋ ๋ถ๋ถ์ด ๊ณผ๋ํ๊ฒ ๋ณต์กํด์ก์๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋กํ ์ฝ์ ๊ฐ ๊ฐ์ฒด๊ฐ ๋ฐ๋์ ๊ตฌํํด์ผํ๋ ๋ฉ์๋๋ค์ ์ ์ํด๋๋๋ฐ ์ด๊ฒ ์ด๋ป๊ฒ ๋ณด๋ฉด ๊ฐ ๊ฐ์ฒด๋ ๊ผญ ์ด ์ญํ ์ ํด์ผํ๋ค๋ ์ฑ
์ ๋ถ๋ด๊ณผ ๊ฐ์ ๊ฒ์ด๋ผ ๊ฐ์ฒด์ ์ญํ ๋ถ๋ด์๋ ์ ์ฉํ ์ฐ์๋ ๊ฒ ๊ฐ๋ค.
์๋ฅผ๋ค์ด ๋๋ ๊ฐ ๋ํ์ด ์ฑ๋ฆฝ๋๋ ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ ์ฑ
์์ ์ด๋์ ๋์ด์ผ ํ ์ง ๊ฐ์ด ์ ์์๋๋ฐ โ๋ํโ์ผ๋ก ์ถ์ํ๋ฅผ ํ๊ณ ๋ชจ๋ ๋ํ์ ๊ณตํต๋๋ ๋ถ๋ถ์ธ ์ ํจ์ฑ ์ฒดํฌ ๋ฉ์๋๋ฅผ ์ค์ํ๋๋ก ์ค๊ณํ๋๊น input์ด๋ factory๊ฐ์ฒด์ ์ฑ
์์ด ๊ณผ๋ํ๊ฒ ๋์ด๋๋๊ฑธ ์ ํ ํ ์ ์์๋ ๊ฒ ๊ฐ๋ค.
โ์ - ์ง์ - ์ผ๊ฐํ - ์ฌ๊ฐํโ ์์๋ก ๋ฏธ์
์ด ํ์ฅ๋์๋๋ฐ ์ง์ ๊ตฌํ ๋จ๊ณ์์ ํ๋กํ ์ฝ์ ๊ตฌํํ๋๊น ์คํ๋ ค ๋ ์ด๋ ค์ด ๋ฏธ์
์ด์๋ ์ผ๊ฐํ๊ณผ ์ฌ๊ฐํ์ ์ถ๊ฐ๋ ๊ตฌํ ์๊ฐ์ด ํจ์ฌ ๋ ์งง์๋ค.
์ ๊ทผ์ ์ด์๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ต์ํด์ก๋ค.
private
ํจ์๋ฅผ ์ฐ๋ ๊ฒ์ด ์ฒ์์ ์๊ฐํ๊ธฐ ๊น๋ค๋กญ๋ค๊ณ ์๊ฐํ์๋๋ฐ, ์ด์ ๋ ๋น์ฐํ ๋ด๋ถ์์๋ง ์ฐ๋ ํจ์์ ์๋ ๊ฒ์ ๊ตฌ๋ถํด์ ์ ๊ทผ์ ์ด์๋ฅผ ์ฐ๋ ค๊ณ ํ๋ค.
main ํ์ผ๋ ์ด๋ฐ ์์ผ๋ก ์ ๊ทผํ๋ฉด ์ง๊ธ๋ณด๋ค ์ค์ด๋ค ๊ฒ ๊ฐ๋ค.
๊ฐ์ฒด์ ์ฑ
์ ๋ถ๋ฆฌ๊ฐ ๋ ์ด์ํด์ก๋ค.
์ฒ์์๋ โ๊ฐ์ฒด์ ์ฑ
์โ์ด๋ผ๋ ๋จ์ด ์์ฒด๊ฐ ์๋ฟ์ง๊ฐ ์์์ ์ฑ
์์ ๋ถ๋ฆฌํ๋๊ฒ ๊ต์ฅํ ์ด์ํ๋ค.
๊ทธ๋์ ์ค๊ณ๊ฐ ๋์ค์ ๊ฐ๋ฉด ๋คํ์ด์ง๊ณ ๋๊ท๋ชจ ๊ณต์ฌ๋ฅผ ํ๋โฆ๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ์์๋๋ฐ ์ง๊ธ์ ๊ธฐ๋ฅ ํ๋, ๊ฐ์ฒด ํ๋๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ์ฑ
์๊ณผ ์ญํ , ๊ทธ๋ฆฌ๊ณ ํ๋ ฅํ๋ ๊ฐ์ฒด๋ ๋ฌด์์ธ์ง ์์ฐ์ค๋ฝ๊ฒ ๋ ์ฌ๋ฆฌ๊ฒ ๋๋ค.
๊ฐ์ฒด์ ์์ฑ๊ณผ ์๋ฉธ
- ๊ฐ์ฒด๋ ๋ณ์๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋์ง ๋ง๊ณ ์ฌ์ฉํ๋ scope ์์์ ์์ฑ๋๊ณ ๋ค๋ฅธ scope์์ ์ฌ์ฉ๋ ์ผ์ด ์์ผ๋ฉด ํด๋น scope์์์ ์๋ฉธ๋๋๋ก ์ฌ์ฉํ๋ ์ต๊ด์ ๊ธธ๋ฌ์ผ ํ๋ค.
์๋ฅผ๋ค์ด mainํ์ผ์์ ์ต๊ด์ ์ผ๋ก ์์์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋ค ์ ์ธํด๋๊ณ ์๋์ชฝ์์ ์ธ์คํด์ค.๋ฉ์๋
ํด์ ์ฌ์ฉํ๋๋ฐ ์ ์ด๋ ์ฌ์ฉํ๋ ์์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ต๊ด์ ๋ค์ด์. (์ฌ์ง์ด do-catch
๋ฌธ ์์์๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ค. ํ์ํ๋ฉด ๊ทธ๋ ๊ฒ ํ์.)
- ๋จ์ง ๊ฐ์ฒด์ ํ๋กํผํฐ๊ฐ์ด ํ์ํ ๋ฟ์ด๋ผ๊ณ ํด์ ๊ฐ์ฒด๋ฅผ ๋ ์์ฑํ ํ์๋ ์๋ค. ๊ฐ์ฒด๋ ํ์ํ ๋๋ง ์์ฑํ๊ณ ํ๋กํผํฐ๊ฐ์ ๊ฐ์ฒด ์์ฑ ์์ด ๊ฐ์ ธ์ฌ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณ ๋ฏผํ๊ณ ๊ฐ์ฒด๋ฅผ ์๋ก ๋ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ต๋ํ ๋ฐฐ์ ํ์.
์๋ฌ์ฒ๋ฆฌ
do-try-catch
๋ฅผ ํ๊บผ๋ฒ์ ๋ค ์ฐ์ง ๋ง๊ณ ํ๋์ ์๋ฌ์ผ์ด์คenum
์ ํ๋์ do-try-catch
๊ฐ ์์ด์ผ ํ๋ค.
- ์๋ฌ์ฒดํฌ๋ฅผ ํ ๋๋ ์ต๊ด์ ์ผ๋ก
if-else
๋ฅผ ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ๋ง์ฝ ์๋ฌ์ฒ๋ฆฌํ๊ณ ํด๋น ๋ฉ์๋๋ฅผ ๋๋ด๋ ๋ก์ง์ด ์์ฐ์ค๋ฝ๋ค๋ฉด guard
๋ฅผ ์ฌ์ฉํ๋ ์ต๊ด์ ๋ค์ด๋๊ฒ ๋ ์ข์ ๊ฒ ๊ฐ๋ค. guard
๋ ์์ฐ์ค๋ฝ๋ค.
- ์๋ฌ์ฒดํฌ๋ฅผ ํ๋ ํจ์ ์ด๋ฆ์ ์ง๊ด์ ์ผ๋ก ์ง์.
๋๋ invalid- ๋ก ์ด๋ฆ์ ์ ํด์ true
์ผ๋ ์๋ฌ๋ฅผ throw
ํ๊ณ false
์ผ๋๊ฐ ์ ์์ผ์ด์ค์ผ ๊ฒฝ์ฐ๋ก ์งฐ๋๋ฐ(if !invalid() {return value}
์ด๋ฐ์์ผ๋กโฆ) ๋ ๋ง๊ณ ๋ค๋ฅธ์ฌ๋์ ์ดํดํ๊ธฐ ํ๋ค๊ฒ์ด๋ผ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋ค. ์คํ๋ ค ์ง๊ด์ ์ผ๋ก isValid()- ์ฒ๋ผ ์ด๋ฆ์ ์ง๊ณ ๋ก์ง์ ๋ฐ๋๋ก ํ๋๊น guard
๋ฌธ์ผ๋ก ๋จ์ํ ํ๋ ๊ฒ๋ ์ฝ๊ณ ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๊ฐ ๋๋ค.
๋ถ์กฑํ๋ ๊ฒ
- ์ขํ๊ณ์ฐ๊ธฐ ๋ก์ง์ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์์์ ์ ์ฉํ๋ค๋ฉด ์ด๋ ์๊น ํ๋ ์๊ฐ์ด ๋ ๋ค.(โ์ > ์ง์ > ์ผ๊ฐํ > ์ฌ๊ฐํโ์ ํ๋ฆ์ด๊ธฐ๋๋ฌธ์. ์ ์ด ๋ชจ๋ ๋ํ์ ํฌ๊ดํ๋ ๊ฐ์ฅ ํฐ ๊ฐ๋
์ด๋ค.)
Set
์ ์ฌ์ฉ : ์ขํ๊ฐ์ด ์๋ก ๊ฐ์ ์ขํ๊ฐ์ ์๋์ง ์ฒดํฌํด์ผํ์๋๋ฐ Set
ํ์
์ผ๋ก ์ขํ๋ฅผ ๋ด์ผ๋ฉด ์ฝ๊ฒ ์ฒ๋ฆฌ๊ฐ ๋์ํ
๋ฐ ํ๋ ์์ฌ์์ด ์๋ค.
- ํ์ํ ํด๋์ค๋ ๋ฉ์๋์ ์ฌ์ ์ :
Equatable
ํ๋กํ ์ฝ์ ์ค๋ฒ๋ผ์ด๋ํด์ ์ฌ์ฉํ์ง๋ง ์ค๋ฒ๋ผ์ด๋๋ฅผ ํ๋ ์ปจ์
์ด ์์ํด์ ๊ฐ๋จํ ์ฝ๋์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๊ตฌํ๋, ์ฌ์ฉ๋ ์ด๋ ค์ ๋ค. ๊ทธ๋ฆฌ๊ณ sortingํ๋ ๊ธฐ๋ฅ์ด ํ์ํด์ Comparable
ํ๋กํ ์ฝ์ ์ค๋ฒ๋ผ์ด๋ํ ํ์๊ฐ ์์๋๋ฐ ๊ฒฐ๊ตญ ์ฌ์ฉํ์ง ๋ชปํ๊ณ ๋ฏธ์
์ด ๋๋ฌ๋ค.
- main.swift ํ์ผ์ด ๊น๋ํ์ง ๋ชปํ ๊ฒ. ์ง๊ธ์ ๋ฐ๋ณต๋ฌธ ๋ด์์ ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํ๋ ์์ผ๋ก ๋์ด์๋๋ฐ ๋ฉ์๋๋ก๋ผ๋ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ก์ง์ ๋ถ๋ฆฌํ์ผ๋ฉด ๋ ๊น๋ํ์ ๊ฒ ๊ฐ๋ค.
- ์ ๋ํ
์คํธ๋ฅผ ์ ๋๋ก ํ์ง ๋ชปํ ๊ฒ. ์ด์์ ์ด๊ฒ๋ ํจ์ ํ๋ ์ถ๊ฐํ ๋๋ง๋ค ํ
์คํธ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํ๋๋ฐ ๋ฌธ์ ๋ฅผ ํ์ด๊ฐ๋ค๋ณด๋ฉด ๊ทธ ํ๋ฆ์ ๋๊ณ ํ
์คํธ์ฝ๋๋ฅผ ์ง๊ธฐ ์ด๋ ต๋ค.
- ์ปค๋ฐ๋จ์๋ฅผ ์๊ฒ ์ชผ๊ฐ์ง ๋ชปํ ๊ฒ. ์ ๊ฒฝ์จ์ ํ๊ธด ํ์ง๋ง ๊ธฐ๋ฅ ์ถ๊ฐํ๋ค๋ณด๋ฉด ๊ณ์ ์ด์ด์ ํ๊ฒ๋๋คโฆ
- ์ปค๋ฐ๋ฉ์์ง๋ฅผ ๊ธธ๊ฒ ์ด๊ฒ ๊ฐ๋ค. ๋ช
ํํ๊ฒ ์ฐ๋๊ฒ ์ข๋ค๊ณ ํด์ ์ผ๋๋ฐ ๋๋ฌด ๊ตฌ์ฒด์ ์ผ๋ก ์ด๊ฑด ์๋๊ฐ ์ถ๋ค.
์์ผ๋ก ํ ๊ฒ
- ๊ฐ์ฒด๋ ํ์ํ ๊ณณ์์ ์ ์ธํ๊ณ ๊ณผ๋ํ๊ฒ ์์ฑํ์ง ์๊ธฐ
- main.swift ๋ด์ ๋ก์ง์ ๋จ์ํํด๋ณด๊ธฐ
- ์๋ฌ์ฒ๋ฆฌ ์ ์ต๊ด์ ์ผ๋ก
if-else
๋ง ์ฐ์ง ์๊ณ guard
๋ฅผ ์ฌ์ฉํ๊ธฐ
- ์๋ฌ์ฒ๋ฆฌ ์
do-try-catch
๋ฅผ ํ ์๋ฌํ์
๋น ํ๋์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ
- ๊ฐ์ฒด์ ํ๋ ฅ์ ๊ฑด๋๋ฐ๊ฑฐ๋ ๊ฑฐ์ฌ๋ฌ์ฌ๋ผ๊ฐ์ง ์๊ธฐ : ๋๊ฐ์ ๋ฐ์ดํฐ๋ผ๋ ํ์ฌ ํ๋ ฅํ๊ณ ์๋ ๊ฐ์ฒด์๊ฒ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํด์ผ์ง ํ๋ ฅํ๊ณ ์์ง ์์ ๊ฐ์ฒด์๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ ํํ๊ฐ ๋๋ฉด ์์กด์ฑ์ด ๋์์ง
- ๊ตฌ์กฐ์ฒด๋ ํด๋์ค ์ด๋ฆ์ -ing ํํ๋ณด๋ค๋ ์์ธํ(๋ง์น ์ฌ๋์ฒ๋ผ) Manager, Checker, Player ํํ๋ก ๋ค์ด๋ฐํ๋๊ฒ ๋ณดํธ์ ์
- computed property๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ฒ๋ผ ํ๋กํผํฐ๊ฐ ํน์ ํ ๋ก์ง์ผ๋ก ๊ณ์ฐ๋์ด์ผ ํ ๋๋ get๋ฉ์๋๋ฅผ ๋ง๋ค์ง ๋ง๊ณ
getter
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ
- ์ปค๋ฐ๋จ์๋ฅผ ์๊ฒ ๋๋ ์ ์ปค๋ฐํ๊ธฐ : ํ๋์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ํ์ธํ๊ณ ์ปค๋ฐํ๊ธฐ!
- ์ ๋ํ
์คํธ ์ต๊ดํํ๊ธฐ
25 Nov 2017
|
protocol
swift
extension
ํ๋กํ ์ฝ
ํ๋กํ ์ฝ์ ํ์
์ด ๋ง์กฑ์ํฌ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ ๋ ํ์ํ๋ค. ํ์
์ด ํ๋กํ ์ฝ์ ๋ง์กฑ์ํฌ๋ ํ๋กํ ์ฝ์ ์ค์ํ๋ค๊ณ ๋งํ๋ค.
ํ๋กํ ์ฝ์ ํ์
์์ฒด๋ก ์ฌ์ฉ๋ ์ ์์ด์ ํ๋กํ ์ฝ ํ์
์ ๊ฐ์ง๋ ๋ณ์๋ ํจ์ ์ธ์ ๋ฆฌํด๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
ํ๋กํ ์ฝ์ด ํ์ํ ๋
func printTable(_ data: [[String]], withColumnLabels columnLabels: String...) {
var firstRow = "|"
var columnWidths = [Int]()
...
- ์ด ํจ์๋ ํ๊ณผ ์ด์ด ๋ช ๊ฐ์ธ์ง ์์์ผ ํ๋ค. ์ธ์๋ฅผ ๋ ๊ฐ ๋ฐ์์ ๋ฐ๋ณต๋ฌธ์ผ๋ก table์ ์ถ๋ ฅํ๋ ํจ์์ด๋ค. ํ์ง๋ง ํ๋กํ ์ฝ์ ์ด์ฉํด์ TableData๋ฅผ ์ ์ํ ํ๋กํ ์ฝ๋ง ๋ฐ์๋ ์๋๋๊ฒ ์ค๊ณํ ์ ์๋ค.
ํ๋กํ ์ฝ ์ ์
...
protocol TableDataSource {
var numberOfRows: Int {get}
var numberOfColumns: Int {get}
func label(forColumn column: Int) -> String
func itemFor(row: Int, column: Int) -> String
}
get
๋ฌธ๋ฒ์ ํ๋กํผํฐ๊ฐ ์ฝ๊ธฐ์ฉ์ด๋ผ๋๋ป์ด๋ค.
- ํ๋กํ ์ฝ์ ํ์
์ด ์ด๋ฐ ํ๋กํผํฐ์ ๋ฉ์๋๋งํผ์ ๊ฐ์ ธ์ผํ๋ค๋ ์ต์ ์๊ฑด์ ์ ์ํ๋ค. TableDataSource ๋ฅผ ์ค์ํ๋ ํ์
๋ค์ numberOfRows, numberOfColumnsํ๋กํผํฐ, label(), itemFor()๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํด์ผํ๋ค.
ํ๋กํ ์ฝ ์ฌ์ฉ
์ ์ํ ํ๋กํ ์ฝ TableDataSourse๋ฅผ ์ค์ํ๋ Department ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด ํ๋กํ ์ฝ์ ์ถ์ํด๋์ค์ฒ๋ผ ์ฌ์ฉํ ์ ์์ด์, ์ด ๊ตฌ์กฐ์ฒด๋ TableDataSourceํ์
์ด ๋๊ณ TableDataSourseํ์
์ฒ๋ผ ์ฌ์ฉ๋ ์ ์๋ค. (ex TableDataSource๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์์ Department๊ฐ ๋ค์ด๊ฐ ์ ์์)
struct Person {
let name: String
let age: Int
let yearOfExperience: Int
}
struct Department: TableDataSource { //TableDataSource ํ๋กํ ์ฝ์ ์ค์ํจ
let name: String
var people = [Person]()
init (name: String) {
self.name = name
}
mutating func add (_ person: Person) {
people.append(person)
}
// ํ๋กํ ์ฝ์ ์ ์๋ numberOfRows์ numberOfColumns๋ {get}๋ฐฉ์ ์ฝ๊ธฐ์ฉ ํ๋กํผํฐ
var numberOfRows: Int {
return people.count
} //var numberOfRows: Int = people.count๊ฐ์ (์ด๋ ๊ฒ๋ ์ฌ์ฉ๋ชปํจ!)
var numberOfColumns: Int {
return 3
}
// ์ฌ์ฉํ ๋ column์์๋ง ์ ํด์ฃผ๋ฉด ๋งค์นญ๋๋ ์ผ์ด์ค์์์ ๋ฌธ์์ด์ ๋ฆฌํด
func label(forColumn column: Int) -> String {
switch column {
case 0: return "Employee Name"
case 1: return "Age"
case 2: return "Years of Experience"
default: fatalError("Invalid column")
}
}
// Department์ ํ๋กํผํฐ์ธ Person๋ฆฌ์คํธ์์์ person์ ๋ณด๋ฅผ ์กฐํ. ํ/์ด ๋ฒํธ๋ง ์ ํด์ฃผ๋ฉด ํด๋น person๊ฐ์ฒด์ ์์ฑ์ ๋ฐํ
func itemFor(row: Int, column: Int) -> String {
let person = people[row]
switch column {
case 0: return person.name
case 1: return String(person.age)
case 2: return String(person.yearOfExperience)
default: fatalError("Invalid column!")
}
}
}
extension์ ํ๋กํ ์ฝ์ ์ฉ
extension
์ ์ด๋ฏธ ์กด์ฌํ๋ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ฑ์ ๊ฐ์ฒด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ํ์ฅํ ์ ์๋ ํค์๋์ด๋ค.
extension
์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์ ํฌํจ๋์ด ์ง์ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๋ผ๋ ํ์ฅ ๊ตฌ๋ฌธ์ ์ด์ฉํ๋ฉด ์ ์ฝ ์์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
๋ํ extension
์ ํ๋กํ ์ฝ์ ์ ์ฉํ ์ ์๋ค.
ํ๋กํ ์ฝ๊ณผ ๊ด๋ จ๋ ํ์ฅ์ ํน์ง ์ค ํ๋๋ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ์๊ณ ๋ ํ๋กํ ์ฝ์ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
<String
๊ณผ Dictionary
์ ํ์ฅ ๊ตฌ๋ฌธ์ ํ๋กํ ์ฝ ๊ตฌํ>
protocol ConvertTarget{
}
extension String: ConvertTarget {
}
extension Dictionary: ConvertTarget {
}
// String๊ณผ Dictionary๋ ํ๋กํ ์ฝ๋ก ์ธํด ConvertTargetํ์
์ผ๋ก ํ๊บผ๋ฒ์ ์ฌ์ฉ ํ ์ ์๊ฒ ๋์๋ค.
22 Nov 2017
|
enum
swift
์ด๊ฑฐํ
๋ฆฌ์คํธ ํํ๋ก ์ ์๋ ์ฌ๋ฌ ์ผ์ด์ค๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ
enum์ ํ๋ฒ ์ ์ฅํด(๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค)๋๊ณ ๊ฐ์ ๋ณ๊ฒฝํด์ ์ฐ์ง ์๋ ์์๊ฐ๋
์ด๊ธฐ๋๋ฌธ์ static๋ณ์์ฒ๋ผ ์ฐ์ฌ ์ธ์คํด์ค ํ๋กํผํฐ๋ก ์ฌ์ฉํ๋ฉด ์ปดํ์ผ์๋ฌ๊ฐ ๋๋ค! (์คํธ๋ญํธ์ด๋ฆ.enumํ์
) ์ผ๋ก ์ฌ์ฉ
์ด๊ฑฐํ์ ํ์
์ถ๋ก
๋ณ์์ ํ์
์ด ์ด๊ฑฐํ์ด๋ผ๋ ๊ฒ๋ง ์๊ณ ์์ผ๋ฉด ์ ๊ฐ์ ๋์
ํ ๋ ํ์
์ ์๋ตํ ์ ์๋ค.
...
var alignment = TextAlignment.left
alignment = .right
์ฒ์์ alignment๋ณ์๋ฅผ ๋ง๋ค๋๋ ์ด๊ฑฐํ์ ํ์
๊ณผ ๊ฐ์ ์ง์ ํด์ผํ์ง๋ง, ๊ทธ ๋ค์ ํ๋ถํฐ๋ ํ์
์ ์๋ตํ๊ณ ๊ทธ ํ์
์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ง์ ํ ์ ์๋ค. (๊ฐ์ ํจ์์ ์ ๋ฌํ ๋๋ ๋น๊ตํ ๋๋ ์ด๊ฑฐํ ์๋ต ๊ฐ๋ฅ)
์กฐ๊ฑด๋ฌธ์ switch๋ก ์ฐ๊ธฐ
enum TextAlignment {
case Left
case Right
case Center
case Justify
}
alignment = .Right //ํ์
์ถ๋ก
if alignment == .Right { //๋น๊ตํ ๋๋ ํ์
์ถ๋ก ๊ฐ๋ฅ
print("We should right-align the text!")
}
//์ด๊ฑฐํ์ ๊ฐ์ if๋ฌธ์์ ๋น๊ตํ ๊ฒฝ์ฐ ๋ณดํต switch๊ตฌ๋ฌธ์ ์ฌ์ฉํจ
switch alignment {
case .Left: print("Left Aligned")
case .Right: print("Right Aligned")
case .Center: print("Center Aligned")
case .Justify: print("Justified")
}
- switch - case๋ฅผ ์ธ๋ ์ด๊ฑฐํ์์๋ default ์ผ์ด์ค๋ฅผ ์ฐ์ง ์๋ ๊ฒ์ด ์ข๋ค.(์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฏธ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฐ์ ์๊ณ ์๊ธฐ๋๋ฌธ์)
๋ฉ์๋
์ค์ํํธ์ ๋ฉ์๋๋ ์ด๊ฑฐํ๊ณผ๋ ์ฐ๋๋๋ค.
// playground(์ ๊ตฌ์ผ๊ธฐ)
enum Lightbulb {
case on
case off
func surfaceTemperature(forAmbientTemp ambient: Double)-> Double { //Lightbulb์ ๋ฉ์๋
switch self {
case .on:
return ambient + 150.0
case .off:
return ambient
}
}
}
var bulb = Lightbulb.on
let ambientTemperature = 100.0
let bulbOnTemperature = bulb.surfaceTemperature(forAmbientTemp: ambientTemperature)
print(bulbOnTemperature) // 250.0
surfaceTemperature
ํจ์๋ enumํ์
์ Lightbulb ๋ด๋ถ์ ์ ์ธ๋์ด์์ผ๋ฉฐ, ์ ๊ตฌ๊ฐ ์ผ์ ธ์ ์ ๊ตฌ ํ๋ฉด์ ์จ๋๊ฐ ์ฌ๋ผ๊ฐ๋ฉด ์ฃผ๋ณ์ ์จ๋๋ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ ํํํ ๋ฉ์๋์ด๋ค.
self
: self๋ Lightbulbํ์
์ ์๋ฌต์ ์ธ ์ธ์. ์ค์ํํธ์ ๋ฉ์๋๋ ์์ธ์์ด self์ธ์๋ฅผ ๊ฐ์ง๋๋ฐ, ์ด self๋ ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ์ธ์คํด์ค์ ์์ธ์คํ๋๋ฐ ์ฌ์ฉ๋๋ค. ์ฌ๊ธฐ์๋ Lightbulb
์ ์ธ์คํด์ค์ ์์ธ์คํ๋๋ฐ ์ฌ์ฉ๋๋ค.
// playground(์ ๊ตฌ ์ผ๊ณ ๋๊ธฐ)
enum Lightbulb {
case on
case off
...
// toggle()ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ ๊ตฌ๊ฐ on์ํ์ผ๋ offํ๊ณ , off์ํ์ผ๋๋ on.
mutating func toggle() {
switch self {
case .on:
self = .off
case .off:
self = .on
}
}
}
var bulb = Lightbulb.on
let ambientTemperature = 100.0
var bulbTemperature = bulb.surfaceTemperature(forAmbientTemp: ambientTemperature)
print(bulbTemperature)
bulb.toggle() // bulb๋ .on์ํ์์ผ๋๊น ์ฌ๊ธฐ์ toggle์ ํธ์ถํด์ off์ํ๋ก ๋ฐ๊ฟ
bulbTemperature = bulb.surfaceTemperature(forAmbientTemp: ambientTemperature)
print("after toggle: \(bulbTemperature)") // after toggle: 100.0
์ฐ๋๋๋ ๊ฐ
enum ShapeDimensions {
case square(side: Double)
case rectangle(width: Double, height: Double)
func area() -> Double {
switch self {
case let .square(side: s):
return s * s
case let .rectangle(width: w, height: h):
return w * h
}
}
}
// ShapeDimensions์ ์ฐ๋๊ฐ์ ๋ง๋ค๋ ค๋ฉด ํด๋น ์ผ์ด์ค์ ๊ทธ์ ๋ฐ๋ฅธ ์ ์ ํ ์ฐ๋๊ฐ์ ์ง์ ํด์ผํ๋ค.
var squareShape = ShapeDimensions.square(side: 10.0) // ํ๋ณ ๊ธธ์ด 10.0์ธ ์ ์ฌ๊ฐํ ์์ฑ
var squareShape2 = ShapeDimensions.square(side: 5.0) // ํ๋ณ ๊ธธ์ด 5.0์ธ ์ ์ฌ๊ฐํ ์์ฑ
print(squareShape.area()) // 100.0
print(squareShape2.area()) // 25.0
var rectangleShape = ShapeDimensions.rectangle(width: 5.0, height: 10.0) // ์ง์ฌ๊ฐํ ์์ฑ
print(rectangleShape.area()) // 50.0
- ShapeDimensions์์
- ์ ์ฌ๊ฐํ์ ์ฐ๋๊ฐ์ ํ ๋ณ์ ๊ธธ์ด
- ์ง์ฌ๊ฐํ์ ์ฐ๋๊ฐ์ ๊ทธ ๋๋น์ ๋์ด - ํํ๋ก width์ height
let
: switch์ ์ผ์ด์ค๋ค์ self์ ์ฐ๋๊ฐ์ ์ ๋ณ์์ ๋ฐ์ธ๋ฉํ๊ธฐ์ํด ์ฌ์ฉ. ์ฐ๋๊ฐ์ ์ฃผ๊ณ ๊ทธ์ ๋ฐ๋ผ์ ShapeDimensionsํ์
์ ์ผ์ด์ค๋ฅผ ๋ง๋ค์ด๋ด๋๋ฐ, ์ฃผ์ด์ง ์ฐ๋๊ฐ์ด ๋ณ๋๋์๋๋ ๋ฑ ๊ทธ๋ ํธ์ถ๋ ์ผ์ด์ค์ ์ ๋๋ก ๋ฐ์ธ๋ฉ๋ ๊ฐ๋ง ์ฃผ๋ ค๊ณ let์ผ๋ก ์์ ๋ฐ์ธ๋ฉ์ ์ํค๋๊ฒ!
let์ด ์์ผ๋ฉด ์ปดํ์ผ์๋ฌ๊ฐ ๋๋๋ฐ, ๋ง์ฝ var squareShape = ShapeDimensions.square(side: 10.0)
๋ var squareShape2 = ShapeDimensions.square(side: 5.0)
์ฒ๋ผ ์ฐ๋๊ฐ์ ๋ค๋ฅด๊ฒ ํด์ ํธ์ถํ์๋ ๋ฐ์ธ๋ฉ์ ์ํด์ฃผ๋ฉด ๋ ๋ฒ ๋ค ํ๋์ ๊ฐ์ ์ฐ๋๊ฐ์ด ์ ์ฉ๋ ์๋ ์๋ค. ๊ทธ๋์ ์ปดํ์ผ๋ฌ๊ฐ ๋ง์๋์๊ฒ ๊ฐ์. (let์ ์ด์จ๋ ์ฐ๋๊ฐ์ผ๋ก ๋ค์ด์จ s, w, h๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ์ํจ์. ๋ด์ผ ์ค๋ช
์ ๋ฃ๊ณ ๋ ๋งค๋๋ฝ๊ฒ ์ ๋ฆฌํด์ผ๊ฒ ๋ค.)
enum์ ์ฐ๊ด๊ฐ์ด ์์๋ ์ฐ๊ด๊ฐ์ด ๋ฌด์์ธ์ง๋ ์์์ผํ๊ณ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ๋ฒ ๋ ๋น๊ตํด์ ๊ฐ์ ๊บผ๋ธ๋ค๋ ๊ฐ๋