[iOS] ์คํ ํฌ๋ CS193P 1๊ฐ
๐ฑ iOS์ ๋ํ ์๊ฐ
์์ ์ Why are they cool? ๋ก ์์ํ๋ค.
์ํฌ์ ์ผ๋ก "iOS์ ํน์ง์ด ๋ฌด์์ธ๊ฐ"๊ฐ ์๋๋ผ iOS๊ฐ ์ผ๋ง๋ cool ๐ ํ์ง์ ๋ํด ์ค๋ช ํ๋ ์ ์ด ํน์ดํ๋ค.
Real-life Object-Oriented Programming
๋ค๋ฅธ OOP, ์๋ฃ๊ตฌ์กฐ ๋ฑ์ ์ ๊ณต๊ณผ๋ชฉ๊ณผ ๋ฌ๋ฆฌ Real-life์์ ์ฐ์ด๋ ๊ฐ๋ฐ์ ๊ฐ์ํด์ค๋ค๊ณ ์๊ฐํ๋ค. ์ ํ๊ต์๋ ์๋๋ก์ด๋ ๊ฐ์๋ ์์ง๋ง iOS ๊ฐ์๊ฐ ์๋ค๋ ๊ฒ์ด ์์ฌ์ ๋๋ฐ ์ญ์ ์คํ ํผ๋์ธ๊ฐ ์ถ์๋ค. ๐๐
์์ ์์ ํ์ฉํ๋ ๊ฒ๋ค
- Tools: Xcode9, Instruments
- Language: swift
- Frameworks: Foundation, UIKit, Core Data, Core Motion, Map Kit
- Design Strategy: MVC
๐ Demo (Concentration game)
Concentration game์ ๋ํ ์ค๋ช ์ด ๋๋๊ณ Xcode์์ ํ๋ก์ ํธ ์์ฑํ๋ ๊ฒ์ ์๋ ค์ฃผ์ ๋ค.
- Create a new Xcode project
- Single view app ๐ ๋ค๋ฅธ ํ ํ๋ฆฟ์ ์ ํํ์ง ๋ง ๊ฒ!
- Organization identifier ๐ ์ด์๊ธฐ๊ด์ ์๋ณ ์์๋ก ๋๋ฅผ ๊ตฌ๋ถํด์ฃผ๋ ์์
UIButton์ ์ฌ์ฉ๋ฒ์ ์๋ ค์ค๋ค. Storyboard์ UIButton๋ฅผ ์ฝ์ ํ๊ณ ๋ฒํผ์ "๐ป" ๊ณ ์คํธ ์์ด์ฝ์ ๋ฃ์ ํ ์ฌ์ด์ฆ ์กฐ์ ํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค. Ctrl ํค๋ฅผ ๋๋ฅธ ์ํ์์ UIButton์ ํด๋ฆญํ์ฌ ์ฝ๋ ์์ญ์ผ๋ก ๋๊ณ ๊ฐ์ touchCard๋ผ๋ ์ก์ ๋ฉ์๋์ ์์ฑํด์คฌ๋ค.
์์ฑํ ์ก์ ๋ฉ์๋์ ์ธ๋ถ ์ด๋ฆ๊ณผ ๋ด๋ถ ์ด๋ฆ์ ๋ํ ์๊ฐ๋ฅผ ํ๋ค. ์์ ์คํฌ๋ฆฐ์ท์์ "_"๊ฐ ์ธ๋ถ ์ด๋ฆ์ด๊ณ , "sender"๊ฐ ๋ด๋ถ ๋ณ์์ด๋ค. ์ด๋ฆ์ ์ ํ ๋ "Read like english"ํ๊ฒ ์ ํ๋ผ๊ณ ํ๋ค. ๋ณ์๋ช ์ ์ฝ๊ธฐ ํธํ๊ฒ ๋ง๋ค๋ผ๋ ๊ฒ์ด์๋ค. ์๋์ ํจ์ ์ฌ์ฉํ ๊ฒ์ ์ฝ์ผ๋ฉด "flip card with emoji ๐ป on sender"๋ผ๊ณ ํ๋ค. ์ต๋ํ ์์ฐ์ค๋ฝ๊ฒ ๋ง๋ค๋ผ๋ ๊ฒ์ผ๋ก ์ดํดํ๋ค.
@IBAction func touchCard(_ sender: UIButton) {
flipCard(withEmoji: "๐ป", on: sender)
}
func flipCard(withEmoji emoji: String, on button: UIButton) { }
UI์ ๋ํ ๋งค๋ด์ผ์ ์ฝ๋ ๊ฒ์ ๊ฐ๋ ฅํ ์ถ์ฒํ๋ค๊ณ ํ๋ค. ํนํ ์์ฃผ ์ฐ๋ UI์ ๋ํด์๋ ๊ผญ ๋ค ์ฝ์ด๋ณด๋ผ๊ณ ํ๋ค.
์ด๋ ํ๋ ์์ํฌ, ์ธ์ด๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๋ ๊ฒ์ ํ์ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ์๊ณ , ์์ ์์ ์ด๋ฐ ๋ด์ฉ์ ์ธ๊ธํ๋ ๊ฒ์ ๋ณด๊ณ ๊ฐ์์ ๋ํ ์ ๋ขฐ๋๊ฐ ์์นํ๋ค๐บ
๋ณ์๋ฅผ ์ ์ธํ๋ฉด์ ์๋์ ๋๊ฐ์ง๋ฅผ ์ธ๊ธํ๋ค.
- Swift is extremely typed language
- Swift has strong type inference
UILabel์ ์ฝ๋ ์์ญ์ผ๋ก ๋๊ณ ์์ ๋ณ์๋ก ์ ์ธํ๋ค. ์ด ๊ฒฝ์ฐ UI ๋ณ์๋ฅผ ์ถ๋ก ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๊ผญ ํ์ ์ ๋ช ์ํด์ผํ๋ค๊ณ ํ๋ค. weak์ ๋ํด์๋ ๋ค์์ฃผ์ ํ๋ค. "!"๋ ๋งค์ฐ ์ค์ํ์ง๋ง ์กฐ๊ธ ์๋ค๊ฐ ๋ค๋ฃฌ๋ค๊ณ ํ๋ค.
@IBOutlet weak var flipCountLabel: UILabel!
Property observers(didSet) ์์ฑ๊ฐ์์๋ฅผ ๋ง์ด ์ฌ์ฉํ ์์ ์ด๋ผ๊ณ ํ๋ค.
- willSet - ๊ฐ์ด ์ ์ฅ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ค.
- didSet - ๊ฐ์ด ์ ์ฅ๋๊ณ ํธ์ถ๋๋ค.
var flipCount = 0 {
didSet {
flipCountLabel.text = "Flips: \(flipCount)"
}
}
Outlet Collection์ ๋ณ์๋ช ์ "cardButons"์์ "cardButtons"๋ก ๋ณ๊ฒฝํ๋ ค๊ณ Xcode์ Rename ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค. Storyboard ๋ณ์๋ ๊ฐ์ด ๋ณด์ฌ์ฃผ๋๊ฒ ์ ๊ธฐํ๋ค.
"CMD + ๋ณ์ํด๋ฆญ" ์ ํตํด ํด๋น ๋ณ์๊ฐ ์ด๋์์ ์ด๋ป๊ฒ ์ฐ์ด๊ณ ์๋์ง ๋ณด์ฌ์ฃผ๊ณ , ํ๊บผ๋ฒ์ ์์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Optional ๋ณ์์ ๋ํด์ ์ค๋ช ํ๋ค. Optional์ ๊ฐ์ด ์๋์ง ์๋์ง์ ๋ํ ๋ณ์์ด๋ค. ๊ฐ์ด ์๋ค๋ฉด ๊ทธ ๋ณ์๋ nil์ด ๋๋ค. Optional ๋ณ์๋ "!"๋ฅผ ๋ถ์ฌ์ unwraping ํด์ค ์ ์๋ค.
@IBAction func touchCard(_ sender: UIButton) {
flipCount += 1
let cardNumber = cardButtons.index(of: sender)!
print("cardNumber = \(cardNumber)")
}
๊ณผ์ : Swift ๋งค๋ด์ผ ์ฝ์ด์ค๊ธฐ
๊ด๋ จ๋งํฌ
์ค์ํํธ ๋ฌธ์: https://developer.apple.com/documentation/swift
๊ฐ์ ์ ํ๋ธ ๋งํฌ: https://youtu.be/TZL5AmwuwlA