iOS๊ฐ๋ฐ์๋ค์๊ฒ ํ์ํ ์๋ฃ๋ค์ ์ ๋ฆฌํ๊ณ ์๋ ์ค์ ๋๋ค.
๋ฉด์ ๋ ๋ฐ์ ์ง๋ฌธ์ด๋ ๊ณต๋ถํ๋ด์ฉ๋ค
์์ ํด์ผํ ๋ด์ฉ์ด๋ ์ถ๊ฐํด์ผํ ๋ด์ฉ์ ์ธ์ ๋ ์ง PR๋ ๋ ค์ฃผ์ธ์!
๋ต์ด ์ ํ์์ง ์์ ์ด์ ๋ ํด๋น ๋ด์ฉ์ ์๊ธฐ์์ผ๋ก ์ธ์ฐ๊ธฐ ๋ณด๋ค ์ฐพ์๋ณด๊ณ ๊ณต๋ถํ๋ฉด์ ์ต๋ ํ์๋๊ฒ ์ข๊ธฐ๋๋ฌธ์
๋๋ค.
ํด๋น๋ด์ฉ์ ์ฐพ์๋ณด๋ฉด์ ๊ด๋ จ๋ ๋ด์ฉ๋ค ๊น์ง ๊ฐ์ด ๊ณต๋ถํ์๋ฉด์ ํด๋น ๋ด์ฉ์ ๋ณธ์ธ์ ๊ฒ์ผ๋ก ์ป์ผ์๊ธฐ ๋ฐ๋๋๋ค.
๋ชจ๋์ ํ์ ๋ชจ์๋ด ์๋ค ๐ฏโโ๏ธ๐ฏโโ๏ธ ๊ฐ์ฌํฉ๋๋ค:)
์๋ ๋ด์ฉ๋ค์ ์ต๋ํ ๋ง์ด ๊ณต๋ถํด๋๋๊ฒ์ด ์ข์ต๋๋ค ๐
- ๋ฉด์ ์๊ธฐ๊ฐ wwdc์ดํ (7์~11์)์ด๋ผ๋ฉด ํด๋น๋ ๋ wwdc์ธ์ ๋ค์ ๋ด ๋์๋ฉด ๋งค์ฐ๋งค์ฐ๋งค์ฐ ์ข์ต๋๋ค.
- Bounds ์ Frame ์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- Frame: SuperView(์์๋ทฐ)์ ์ขํ์์คํ
์์์ View์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ํ๋
๋๋ค.
- Bounds: View์ ์์น์ ํฌ๊ธฐ๋ฅผ ์์ ๋ง์ ์ขํ์์คํ
์์์ ๋ํ๋
๋๋ค.
- ๋ทฐ์ Frame ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด, ํด๋น ๋ทฐ์ ์์น๊ฐ ๋ณํ์ง๋ง,
- ๋ทฐ์ Bounds ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ํด๋น ๋ทฐ๋ฅผ ์ค์ฌ์ผ๋ก ๋ณด์ด๋ ์๊ฐ์ด ๋ฐ๋๋ค. (scrollView)
-
์ค์ ๋๋ฐ์ด์ค๊ฐ ์์ ๊ฒฝ์ฐ ๊ฐ๋ฐ ํ๊ฒฝ์์ ํ ์ ์๋ ๊ฒ๊ณผ ์๋ ๊ฒ์ ์ค๋ช ํ์์ค.
-
์ฑ์ ์ฝํ ์ธ ๋ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์ ์ฅ/๋ณด๊ดํ๋ ํน๋ณํ ๊ฐ์ฒด๋ฅผ ๋ฌด์์ด๋ผ๊ณ ํ๋๊ฐ?
- Core Data
๋๋ฐ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ง or ์บ์ํ๊ณ ์คํ ์ทจ์๋ฅผ ์ง์ํ๋ ํ๋ ์์ํฌ ์๊ตฌ ๋ฐ์ดํฐ ์ ์ฅ ์ฆ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ธฐ๋ฅ์ Core Data ๊ธฐ๋ฅ์ ์ผ๋ถ๋ถ์ผ๋ก ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ธฐ๋ฅ์ ํฌ๊ดํ๋ ํ๋ ์์ํฌ์ด๋ค
-
์ฑ ํ๋ฉด์ ์ฝํ ์ธ ๋ฅผ ํ์ํ๋ ๋ก์ง๊ณผ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๊ฐ์ฒด๋ฅผ ๋ฌด์์ด๋ผ๊ณ ํ๋๊ฐ?
- ViewController
์ฑ ๊ตฌ์กฐ์ ๋ผ๋, ๋ชจ๋ ์ฑ์ ๋ฐ๋์ ํ๋ ์ด์์ view controller๋ก ์ด๋ฃจ์ด์ ธ ์์, ๋ชจ๋ view controller ๋ค์ ์์ ํด๋์ค
-
App thinning์ ๋ํด์ ์ค๋ช ํ์์ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ฐ์ด์ค์ ์ค์น๋ ๋, ์ฑ ์คํ ์ด์ ์ด์์ฒด์ ๊ฐ ๋๋ฐ์ด์ค์ ํน์ฑ์ ๋ง๊ฒ ์ค์น๋๋๋ก ํ๋ ์ค์น ์ต์ ํ ๊ธฐ์ ์ ์๋ฏธํฉ๋๋ค.
-
์ฑ์ด ์์ํ ๋ main.c ์ ์๋ UIApplicationMain ํจ์์ ์ํด์ ์์ฑ๋๋ ๊ฐ์ฒด๋ ๋ฌด์์ธ๊ฐ?
- UIApplication ์ฑ๊ธํด ๊ฐ์ฒด
์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ ์ด๋ฒคํธ ์ฃผ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค.
-
@Main์ ๋ํด์ ์ค๋ช ํ์์ค.
UIKit ๊ธฐ๋ฐ ์ฑ์ main entry point
-
์ฑ์ด foreground์ ์์ ๋์ background์ ์์ ๋ ์ด๋ค ์ ์ฝ์ฌํญ์ด ์๋์?
Foreground mode๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๊ธฐํ ์์คํ ๋ฆฌ์์ค์ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฉฐ ์์คํ ์ ์ด๋ฌํ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์์ ๋ฐ๋ผ background ์ฑ์ ์ข ๋ฃํฉ๋๋ค. Background mode๋ ๊ฐ๋ฅํ ์ ์ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์ฌ์ฉํด์ผํจ(์์คํ ๋ฆฌ์์ค ํด์ , ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ํ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์์ฑ)
-
์ํ ๋ณํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฑ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฉ์๋๋ค์ ์ค๋ช ํ์์ค.
//์ ํ๋ฆฌ์ผ์ด์
์ด ์คํ๋ ์งํ ์ฌ์ฉ์์ ํ๋ฉด์ ๋ณด์ฌ์ง๊ธฐ ์ง์ ์ ํธ์ถ
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
//์ ํ๋ฆฌ์ผ์ด์
์ด ์ต์ด ์คํ๋ ๋ ํธ์ถ๋๋ ๋ฉ์๋
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
//์ ํ๋ฆฌ์ผ์ด์
์ด InActive ์ํ๋ก ์ ํ๋๊ธฐ ์ง์ ์ ํธ์ถ task ์ผ์์ ์ง, ํ์ด๋จธ ๋นํ์ฑํ, ์ผ์์ ์ง(๊ฒ์)
func applicationWillResignActive(_ application: UIApplication)
//์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ๋ก ์ ํ๋ ์งํ ํธ์ถ
func applicationDidEnterBackground(_ application: UIApplication)
//์ ํ๋ฆฌ์ผ์ด์
์ด Active ์ํ๊ฐ ๋๊ธฐ ์ง์ , ํ๋ฉด์ ๋ณด์ฌ์ง๊ธฐ ์ง์ ์ ํธ์ถ
func applicationWillEnterForeground(_ application: UIApplication)
//์ ํ๋ฆฌ์ผ์ด์
์ด Active ์ํ๋ก ์ ํ๋ ์งํ ํธ์ถ
func applicationDidBecomeActive(_ application: UIApplication)
//์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋๊ธฐ ์ง์ ์ ํธ์ถ
func applicationWillTerminate(_ application: UIApplication)
- ์ฑ์ด In-Active ์ํ๊ฐ ๋๋ ์๋๋ฆฌ์ค๋ฅผ ์ค๋ช ํ์์ค.
App switcher ๋ก ์ ํ๋ ๋
๋ค๋ฅธ ์ฑ์ ์๋ฆผ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์์ ํ์ง ๋ชปํ ๋
- scene delegate์ ๋ํด ์ค๋ช ํ์์ค.
iOS 13๋ถํฐ AppDelegate์ ์ฑ
์์ด AppDelegate์ SceneDelegate๋ก ๋ถ๋ฆฌ๋์๋ค.
App Delegate โ ์ ํ๋ฆฌ์ผ์ด์
์๋ช
์ฃผ๊ธฐ ๋ฐ ์ค์ ๋ด๋น
App Life Cycle
Session Life Cycle
Scene Delegate โ ํ๋ฉด์ ํ์๋๋ ๋ด์ฉ(Windows ๋๋ Scenes)์ ์ฒ๋ฆฌํ๊ณ ์ฑ์ด ํ์๋๋ ๋ฐฉ์์ ๊ด๋ฆฌ
window โ scene
- UIApplication ๊ฐ์ฒด์ ์ปจํธ๋กค๋ฌ ์ญํ ์ ์ด๋์ ๊ตฌํํด์ผ ํ๋๊ฐ?
UIApplication ๊ฐ์ฒด๋ UIApplicationMain(_:_:_:_:) ํจ์์์ Singleton ๊ฐ์ฒด๋ก ์์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํจ์๋ @main์ด ์ ์ธ๋์ด ์๋ App Delegate ์์ ์คํ๋๋ค.
- App์ Not running, Inactive, Active, Background, Suspended์ ๋ํด ์ค๋ช ํ์์ค.
Not Running์ ์ฑ์ด ์์ง ์คํ๋์ง ์์๊ฑฐ๋, ์์ ํ ์ข
๋ฃ๋์ด ๋์ํ์ง ์๋ ์ํ.
Inactive๋ app์ด ์คํ์ค์ด์ง๋ง ์ฌ์ฉ์๋ก๋ถํฐ event๋ฅผ ๋ฐ์ ์ ์๋ ์ํ. multitasking window๋ก ์ง์
ํ๊ฑฐ๋ app ์คํ์ค ์ ํ, ์๋ฆผ ๋ฑ์ ์ํด app์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ ์ด ์ํ๋ก ์ง์
.
Active๋ app์ด ์ค์ ์คํ์ค์ด๊ณ ์ฌ์ฉ์ event๋ฅผ ๋ฐ์์ ์ํธ์์ฉํ ์ ์๋ ์ํ.
(๋ฐ๋ก Active๊ฐ ๋์ง ์๊ณ Inactive ์ํ๋ฅผ ๊ฑฐ์ณ Active์ํ๊ฐ ๋๋ค.)
Background๋ ํํ๋ฉด์ผ๋ก ๋๊ฐ๊ฑฐ๋ ๋ค๋ฅธ app์ผ๋ก ์ ํ๋์ด ํ์ฌ app์ด ์ค์ง์ ์ธ ๋์์ ํ์ง ์๋ ์ํ.
Suspended๋ app์ ๋ค์ ์คํํ์ ๋ ์ต๊ทผ ์์
์ ๋น ๋ฅด๊ฒ ๋ก๋ํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ ๋ฐ์ดํฐ๋ง ์ ์ฅ๋์ด์๋ ์ํ
app์ด background ์ํ์ ์ง์
ํ์ ๋ ๋ค๋ฅธ ์์
์ ํ์ง ์์ผ๋ฉด Suspended ์ํ๋ก ์ง์
ํ๊ฒ ๋ฉ๋๋ค
Suspended ์ํ์ app๋ค์ iOS์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋จ.
๋ฐ๋ผ์ app์ ์ข
๋ฃ์ํจ ์ ์ด ์๋๋ผ๋ app์ ๋ค์ ์คํํ๋ ค๊ณ ํ๋ฉด ์ฒ์๋ถํฐ ๋ค์ ์คํ๋ฉ๋๋ค.
- NSOperationQueue ์ GCD Queue ์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
๋ฉํฐ์ค๋ ๋ฉ์ ์ํ API
์ฝ๊ณ ํธํ ๋ฉํฐ ์ค๋ ๋ฉ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ ํ์ ๋๊ฐ์ง์ API๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
GCD(Grand Central Dispatch)๋ผ๋ C๊ธฐ๋ฐ์ ์ ์์ค API์ NSOperation์ด๋ผ๋ Obj-C ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๊ณ ์์ค API๊ฐ ์๋ค. NSOperation์ GCD๋ณด๋ค ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ๋ ๋ฐ์๋๊ณ ๋๋ฆฌ์ง๋ง GCD์์๋ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ ์์
๋ค์ ์ง์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ (KVO๊ด์ฐฐ, ์์
์ทจ์ ๋ฑ๋ฑ) ๊ทธ์ ๋๋ ๊ฐ์ํ๊ณ ์ฌ์ฉํ ๋งํ๋ค.
GCD๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ค๋ ๋๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ๋์์ ์ผ๋ก ์์
์ ์คํ์ํค๋ ์ ์์ค API๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
- Dispatch Queues: ๋์คํจ์น ํ๋ FIFO ์์๋ก ์์
์ ์คํ์ํค๋ ์ญํ ์ ๋ด๋น
- Serial Dispatch Queue: ์๋ฆฌ์ผ ๋์คํจ์น ํ๋ ํ๋ฒ์ ํ ์์
๋ง ์คํ
- Concurrent Dispatch Queue: ์ปจ์ปค๋ฐํธ ๋์คํจ์น ํ๋ ์์ํ ์์
์ด ๋๋๋๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๊ฐ๋ฅํ ๋ง์ ์์
์ ์คํ
- Main Dispatch Queue: ์ฑ์ ๋ฉ์ธ ์ค๋ ๋์์ ์์
์ ์คํํ ์์๋ ์ ์ญ์์ ์ฌ์ฉ๊ฐ๋ฅํ ์๋ฆฌ์ผ ํ
- GCD API ๋์ ๋ฐฉ์๊ณผ ํ์์ฑ์ ๋ํด ์ค๋ช ํ์์ค.
GCD๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ค๋ ๋๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ๋์์ ์ผ๋ก ์์
์ ์คํ์ํค๋ ์ ์์ค API๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฉ์ด์๋ ๋ค์์ด ์๋ค.
- Dispatch Queues, ๋์คํจ์น ํ๋ FIFO ์์๋ก ์์
์ ์คํ์ํค๋ ์ญํ ์ ๋ด๋นํ๋ค.
- Serial Dispatch Queue, ์๋ฆฌ์ผ ๋์คํจ์น ํ๋ ํ๋ฒ์ ํ ์์
๋ง ์คํ์ํจ๋ค.
- Concurrent Dispatch Queue, ์ปจ์ปค๋ฐํธ ๋์คํจ์น ํ๋ ์์ํ ์์
์ด ๋๋๋๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๊ฐ๋ฅํ ๋ง์ ์์
์ ์คํ์ํจ๋ค.
- Main Dispatch Queue, ์ฑ์ ๋ฉ์ธ ์ค๋ ๋์์ ์์
์ ์คํํ ์์๋ ์ ์ญ์์ ์ฌ์ฉ๊ฐ๋ฅํ ์๋ฆฌ์ผ ํ
- ์ฑ์ ์คํํ๋ฉด ์์คํ
์ด ์๋์ผ๋ก ๋ฉ์ธ์ค๋ ๋ ์์์ ๋์ํ๋ Main ํ(Serial Queue)๋ฅผ ๋ง๋ค์ด์ ์์
์ ์ํํ๊ณ , ๊ทธ ์ธ์ ์ถ๊ฐ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ Global ํ(Cuncurrent Queue)๋ฅผ ๋ง๋ค์ด์ ํ๋ฅผ ๊ด๋ฆฌ
ํ์์ฑ
- Thread ๋ฅผ ์ง์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋นํด ๊ด๋ฆฌ ์ฉ์ด
- ์ด๋ฏธ์ง ๋ค์ด๋ก๋์ ๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์ ๋๊ธฐ๋ก ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด ํด๋น ์์
์ด ๋๋ ๋๊น์ง ํ๋ฉด์ด ๋ฉ์ถ๊ฒ ๋จ. ๋ฐ๋ผ์ ๋น๋๊ธฐ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์์ ์์
์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ํ์ํจ
- Global DispatchQueue ์ Qos ์๋ ์ด๋ค ์ข ๋ฅ๊ฐ ์๋์ง, ๊ฐ๊ฐ ์ด๋ค ์๋ฏธ์ธ์ง ์ค๋ช ํ์์ค.
## GCD
ํ๋ง๋ค ์๋ก ๋ค๋ฅธ ํน์ง์ ๊ฐ์ง๊ณ ์์ด ์ํ๋ ํน์ง์ ๋ง๊ฒ ํ์ ๋ณด๋ด๋ฉด ๋๋ค
1) Main ํ - ๋ฉ์ธ์ฐ๋ ๋ Serial
2) Global ํ - Defalut Concurrent(์ฌ๋ฌ๊ฐ ์ค๋ ๋๋ก ๋ถ์ฐ์ฒ๋ฆฌ)
3) Private ํ - ์ปค์คํ
ํ
Global ํ Qos
DispatchQueue.global(qos: .userInteractive) - ์ฆ์
์๋๋ฉ์ด์
, UI ์
๋ฐ์ดํธ
๋ฉ์ธํ๋ userInteractive ์ด์ง๋ง, userInteractive ํ๋ผ๊ณ ํด์ ํญ์ ๋ฉ์ธํ์ธ๊ฒ์ ์๋๋ค.
DispatchQueue.global(qos: .userinitiated) - ๋ช์ด
์ ์ ๊ฐ ์ฆ์ ํ์ํ์ง๋ง, ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์์
(ํ์ผ ๋ค์ด๋ก๋, ์ด๊ธฐ)
DispatchQueue.global() - Default
DispatchQueue.global(qos: .utility) - ๋ช์ด ~ ๋ช๋ถ
Progress indicator์ ํจ๊ป ๊ธธ๊ฒ ์คํ๋๋ ์์
ex Networking , IO, ๊ณ์ฐ
DispatchQueue.global(qos: .background)
DB ๊ฐ์ ธ์ค๊ธฐ / ์ ์ง
DispatchQueue.global(qos: .unspecifed)
- iOS ์ฑ์ ๋ง๋ค๊ณ , User Interface๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ํ์์ ์ธ ํ๋ ์์ํฌ ์ด๋ฆ์ ๋ฌด์์ธ๊ฐ?
UIKit
- Foundation Kit์ ๋ฌด์์ด๊ณ ํฌํจ๋์ด ์๋ ํด๋์ค๋ค์ ์ด๋ค ๊ฒ์ด ์๋์ง ์ค๋ช ํ์์ค.
Foundation Kit์ Cocoa Touch framework์ ํฌํจ๋์ด ์๋ ํ๋ ์์ํฌ ์ค ํ๋์
๋๋ค.
String, Int ๋ฑ์ ์์ ๋ฐ์ดํฐ ํ์
๊ณผ ์ปฌ๋ ์
ํ์
๋ฐ ์ด์์ฒด์ ์๋น์ค๋ฅผ ์ฌ์ฉํด ์ฑ์ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ๊ด๋ฆฌํ๋ ํ๋ ์์ํฌ์
๋๋ค.
- Delegate๋ ๋ฌด์ธ์ธ๊ฐ ์ค๋ช ํ๊ณ , retain ๋๋์ง ์๋๋์ง ๊ทธ ์ด์ ๋ฅผ ํจ๊ป ์ค๋ช ํ์์ค.
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํ๋์ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ์ฒ๋ฆฌํด์ผ ํ ์ผ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ธฐ๋ ๊ฒ
ํจ์จ์ฑ ๊ด์ ์์ ์์ฃผ ์ค์ํ ์ญํ ์ ํจ, ๊ธฐ๋ฅ์ ์์ํ ์ ์๋ ๊ฐ์ฒด๊ฐ ์๋ค๋ ๊ฒ์ ๊ทธ๋งํผ ์ง์ ๊ตฌํํด์ผ ํ๋ ๋ถ๋ถ์ด ์ ๋ค๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ํฐ ๊ท๋ชจ์ ํ๋ก๊ทธ๋จ์ ๋น ๋ฅด๊ฒ ๊ตฌํ๊ฐ๋ฅ
Retain Cycle: ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋์ง ์๊ณ ์ ์ง๋์ด ๋์๊ฐ ์๊ธฐ๋ ํ์
์ํ์ฐธ์กฐ(๋ ๊ฐ์ฒด๊ฐ ์๋ก ์ก๊ณ ์์ด ํ๋๊ฐ ์ฌ๋ผ์ง๋ ค๊ณ ํ ๋ ๋ค๋ฅธ ํ ์ชฝ์ด ์ก๊ณ ์์ผ๋ฉด ์ฌ๋ผ์ง์ง ์๋ ํ์)์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ค, weak ์ ์ธ๊ณผ ์ต์
๋๋ก ์ ์ธํด ์ฝํ ์ฐธ์กฐ๋ก ์ ์ธํด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์์ ๋ฐฉ์งํ๋ค.
- NotificationCenter ๋์ ๋ฐฉ์๊ณผ ํ์ฉ ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
NotificationCenter
๋ฑ๋ก๋ ์ต์ ๋ฒ์๊ฒ ๋
ธํฐํผ์ผ์ด์
์ ์ ๋ฌํ๋ ํด๋์ค
๋์ ๋ฐฉ์
๊ฐ์ฒด A : listener
๊ฐ์ฒด B : sender
NotificationCenter
๊ฐ์ฒด A๋ ๊ฐ์ฒด B์ ์ด๋ ํ ํ์๋ฅผ ๊ด์ฐฐํ๊ธฐ ์ํด NotificationCenter์ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋กํ๋ค.
์ต์ ๋ฒ์๋ ์ด๋ค ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ ๊ฒ์ธ์ง, ์ด๋ค ํ์๋ฅผ ๊ด์ฐฐํ ๊ฒ์ธ์ง ๋ฑ์ด ๋ค์ด๊ฐ
AViewController.swift
NotificationCenter.default.addObserver(self, selector: #selector(handleNoti(_:)), name: "myNoti", object: nil)
๊ฐ์ฒด B๊ฐ ์ด๋ ํ ํ์๋ฅผ ํ๋ค.
๊ฐ์ฒด B๋ ์๋ฆผ์ ์์ฑํ๊ณ NotificationCenter์ postํจ
BViewController.swift
NotificationCenter.default.post(name:"myNoti", object:" ์ ๋ฌํ ๊ฐ")
NotificationCenter๋ ๊ฐ์ฒด A์๊ฒ ๋ฑ๋กํ ์ต์ ๋ฒ์ ๋ํ ์๋ฆผ์ด ๋ฐ์ํ๋ค๊ณ ์๋ ค์ค
ํ์ฉ ๋ฐฉ์
์์ง๊น์ง ์ปค์คํ
๋
ธํฐํผ์ผ์ด์
์ ํ์ฉํด๋ณธ ๊ฒฝํ์ ์๋ค. UIApplication.willEnterForegroundNotification ์ ํ์ฉํ์ฌ
์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํฌ๊ทธ๋ผ์ด๋๋ก ์ง์
ํ์ ๋น์๋ฅผ ์ฒดํฌํด์ ๋ฌด์ธ๊ฐ๋ฅผ ํด์ค ๊ฒฝํ์ ์์.
- UIKit ํด๋์ค๋ค์ ๋ค๋ฃฐ ๋ ๊ผญ ์ฒ๋ฆฌํด์ผํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฐ๋ ๋ ์ด๋ฆ์ ๋ฌด์์ธ๊ฐ?
๋ฉ์ธ ์ค๋ ๋
- App Bundle์ ๊ตฌ์กฐ์ ์ญํ ์ ๋ํด ์ค๋ช ํ์์ค.
์ ํ๋ฆฌ์ผ์ด์
๋ฒ๋ค์ ์ฑ๊ณต์ ์ธ ์๋์ ์ํด ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ์ฅํฉ๋๋ค.
๊ตฌ์กฐ
MyApp: ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๋๋ฅผ ํฌํจํ๋ ์คํํ์ผ
app Icon: ์์ด์ฝ
Info.plist: ๋ฒ๋ค ID, ๋ฒ์ ๋ฒํธ ๋ฐ ์ฑ ํ์ ์ด๋ฆ๊ณผ ๊ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑ์ ๋ณด ํฌํจ
Launch images: ์์ ํ๋ฉด์ ๋ณด์ฌ์ง ์ด๋ฏธ์ง
MainWindow.nib: ์์ฉ ํ๋ก๊ทธ๋จ ์์ ์ ๋ก๋ ํ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค ๊ฐ์ฒด ํฌํจ
Settings.bundle: ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ถ๊ฐํ๋ ค๋ ์ ํ๋ฆฌ์ผ์ด์
๋ณ ํ๊ฒฝ ์ค์ ์ ํฌํจํ๋ ํน์ ์ ํ ํ๋ฌ๊ทธ์ธ
์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค ํ์ผ: ์ง์ญํ๋ ๋ฆฌ์์ค or ์ง์ญํ๋์ง ์์ ๋ฆฌ์์ค ํ์ผ ๋ฑ๋ฑ..
- ๋ชจ๋ View Controller ๊ฐ์ฒด์ ์์ ํด๋์ค๋ ๋ฌด์์ด๊ณ ๊ทธ ์ญํ ์ ๋ฌด์์ธ๊ฐ?
UIViewController: UIResponder
์ญํ
๊ธฐ๋ณธ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ ๋ํ ์๋ต์ผ๋ก ๋ทฐ์ ์ฝํ
์ธ ๋ฅผ ์
๋ฐ์ดํธ
๋ทฐ์ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์๋ต
๋ทฐ ํฌ๊ธฐ ์กฐ์ ๋ฐ ์ ์ฒด ์ธํฐํ์ด์ค์ ๋ ์ด์์ ๊ด๋ฆฌ
์ฑ์์ ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ํฌํจํ ๋ค๋ฅธ ๊ฐ์ฒด์ ์กฐ์
- ์์ ๋ง์ Custom View๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์ง ์ค๋ช ํ์์ค.
UIView๋ฅผ ์์ํ๋ custom class ๋ฅผ ํ๋ ์์ฑํด์ค๋ค.
UIView๋ ๋๊ฐ์ ํ์ ์์ฑ์๊ฐ ์๋ค
override init - ์ฝ๋๋ก ๋ทฐ๋ฅผ ๋ง๋ค๋ ์ฌ์ฉ๋๋ ์์ฑ์
required init - ์คํ ๋ฆฌ๋ณด๋๋ฅผ ํตํด์ View๋ฅผ ์ฐ๊ฒฐ ํ ๋ ์ฌ์ฉ๋๋ ์์ฑ์
- View ๊ฐ์ฒด์ ๋ํด ์ค๋ช ํ์์ค.
ํ๋ฉด์ ์ง์ฌ๊ฐํ ์์ญ์ ๋ํ ์ฝํ
์ธ ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด. ๋ชจ๋ ๋ทฐ์ ๊ณตํต์ ์ธ ๋์์ ์ ์ํ๋ฉฐ UIButton, UIImageView, UILabel ๊ณผ ๊ฐ์ ๋ชจ๋ ๋ทฐ ํด๋์ค์ ์์ ํด๋์ค
๊ทธ๋ฆฌ๊ธฐ ๋ฐ ์ ๋๋ฉ์ด์
Core Graphics, UIViewAnimations, CoreAnimation
๋ ์ด์์ ๋ฐ ํ์๋ณด๊ธฐ ๊ด๋ฆฌ
์คํ ๋ ์ด์์
์ด๋ฒคํธ ์ฒ๋ฆฌ
UIResponder โ ํฐ์น ๋ฐ ๊ธฐํ ์ ํ์ ์ด๋ฒคํธ ์๋ต
์ ์ค์ฒ ์ธ์
์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ํ ์กฐ์์ ๋ฉ์ธ ์ค๋ ๋์์ ํด์ผ ํจ. ๋ฉ์ธ ์ค๋ ๋๊ฐ ํ์ํ์ง ์์ ์ ์๋ ์ ์ผํ ๊ฒฝ์ฐ๋ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฟ์ด๊ณ , ๊ทธ ์ธ์ ๋ชจ๋ ์กฐ์์ ๋ฉ์ธ ์ค๋ ๋์์ ๋ฐ์ํด์ผ ํจ.
Core Animation API๊ฐ ์ ๊ณตํ๋ ์์์ค ํ๋๋ก ๋ทฐ ์์ ์ปจํ
์ธ ๋ ์ ๋๋ฉ์ด์
์ ๊ทธ๋ฆฌ๋ ์ญํ ์ ํ๋ค.
UIView์ ์ญํ ์ ํฌ๊ฒ 1. ํ๋ฉด ํ์ 2. ํฐ์น ์ด๋ฒคํธ 3. subview๊ด๋ฆฌ ์ธ๋ฐ, ์ด์ค ํ๋ฉดํ์(๋ทฐ ์์ ์ปจํ
์ธ ๋ ์ ๋๋ฉ์ด์
์ ๊ทธ๋ฆฌ๋ ํ์)๋ฅผ ์ง์ ํ์ง์๊ณ , Core Animation์ ์์ํ๋ค.
UIView๋ ํ๋์ CALayer๋ง ๊ฐ์ง๊ณ ์๋ค.
CALayer๋ SubLayer๋ฅผ ์ฌ๋ฌ๊ฐ ๋ ์ ์๋ค.
UIView์ SubView๋ UIView์ CALayer ์์ ์นํ์ง๋ ๊ฒ์
- UIWindow ๊ฐ์ฒด์ ์ญํ ์ ๋ฌด์์ธ๊ฐ?
์ฑ์ ์๊ฐ์ ์ฝํ
์ธ ๋ฅผ ๋ด๋๋ค.
๋ทฐ๋ค๊ณผ ๋ค๋ฅธ ์ดํ๋ฆฌ์ผ์ด์
๊ฐ์ฒด๋ค์๊ฒ ํฐ์น ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ์ค์ํ ์ญํ ์ ํ๋ค.
์ค๋ฆฌ์ํ
์ด์
๋ณํ๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ฑ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค๊ณผ ํ๋ ฅํ๋ค.
-
UINavigationController ์ ์ญํ ์ด ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ ์ปจํ ์ด๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก์จ ๋ค๋น๊ฒ์ด์ ์คํ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
-
TableView๋ฅผ ๋์ ๋ฐฉ์๊ณผ ํ๋ฉด์ Cell์ ์ถ๋ ฅํ๊ธฐ ์ํด ์ต์ํ ๊ตฌํํด์ผ ํ๋ DataSource ๋ฉ์๋๋ฅผ ์ค๋ช ํ์์ค.
๋์ ๋ฐฉ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ํ ์ด๋ธ ๋ทฐ์ ๋ฐ์ดํฐ ์์ค์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ค์ ํ๊ณ reloadData ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. ๋ฐ์ดํฐ ์์ค๋ UITableView ๊ฐ์ฒด๋ก๋ถํฐ numberOfRowsInSection: ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ํ ์ด๋ธ๋ณด๊ธฐ์ ์น์ ์๋ฅผ ๋ฐํํฉ๋๋ค ๊ฐ ์น์ ์ ๋ํด ๋ฐ์ดํฐ ์์ค๋ tableView : numberOfRowsInSection : ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ์น์ ์ ํ ์๋ฅผ ๋ฐํํ์ฌ ์๋ตํฉ๋๋ค. ๋ฐ์ดํฐ ์์ค๋ ํ ์ด๋ธ ๋ทฐ์ ํ์๋๋ ๊ฐ ํ์ ๋ํด tableView : cellForRowAt : ๋ฉ์์ง๋ฅผ ์์ ํฉ๋๋ค. ๊ฐ ํ์ ๋ํด UITableViewCell ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ฐํํ์ฌ ์๋ตํฉ๋๋ค. UITableView ๊ฐ์ฒด๋์ด ์ ์ ์ฌ์ฉํ์ฌ ํ์ ๊ทธ๋ฆฝ๋๋ค. DataSource Method tableView(_:numberOfRowsInSection) -> Int : ์น์ ๋ณ cell ๊ฐ์๋ฅผ ๋ฆฌํดํฉ๋๋ค. tableView(_:cellForRowAt:) -> UITableViewCell : ๋ฐํํ TableViewCell์ ์ ์ํฉ๋๋ค.
-
ํ๋์ View Controller ์ฝ๋์์ ์ฌ๋ฌ TableView Controller ์ญํ ์ ํด์ผ ํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๊ตฌ๋ถํด์ ๊ตฌํํด์ผ ํ๋์ง ์ค๋ช ํ์์ค.
1. viewDidLoad() ์์ register ํจ์๋ฅผ ์ฌ์ฉํด์ ์ ์ ๋ฑ๋กํ๋ค. 2. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ tableView๋ฅผ ๊ฐ์ฒด ๋น๊ต๋ฅผ ํตํด ๊ตฌ๋ถํ๋ค. 3. ํ์์ ๊ฐ๊ฐ์ tableView์ content size๋ฅผ ๊ตฌ๋ ํ๋ฉด์ ํ ์ด๋ธ๋ทฐ์ height๋ฅผ ๋์ ์ผ๋ก ๊ด๋ฆฌํด์ค๋ค.
-
setNeedsLayout์ setNeedsDisplay์ ์ฐจ์ด์ ๋ํด ์ค๋ช ํ์์ค.
setNeedsLayout๋ฉ์๋๋ layoutSubview๋ฉ์๋๋ฅผ, setNeedsDisplay๋ draw๋ฉ์๋๋ฅผ ์์คํ ์ด ํธ์ถํ๊ฒ๋ ์ ๋ํ๋ค. layoutSubview๋ฉ์๋๋ view์ position์ด๋ layout์ ๊ดํ ๋ณํ๋ฅผ ์ ์ฉ์ํค๊ณ , draw๋ฉ์๋๋ ๋ค์ ๋๋ก์ ์ฌ์ดํด์ด ์ค๋ฉด ๊ทธ ๋ ์์ฌ์๋ ๊ทธ๋ ค์ผ ํ ์ปจํ ์ธ ๋ค์ ๋์์ ์ ์ฉ์ํจ๋ค.
-
NSCache์ ๋์ ๋๋ฆฌ๋ก ์บ์๋ฅผ ๊ตฌ์ฑํ์๋์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค.
-
URLSession์ ๋ํด์ ์ค๋ช ํ์์ค.
URLSession์ iOS์์ ์ ๊ณตํ๋ HTTP๋ฅผ ์ด์ฉํ ๋คํธ์ํน์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ๋์์ฃผ๋ API๋ฅผ ์ ๊ณตํด์ฃผ๋ ํด๋์ค์ ๋๋ค URLSession์ URLSessionConfiguration์ ํตํด ์์ฑํ ์ ์์ต๋๋ค. URLSessionConfiguration์ ์๋์ ์ธ๊ฐ์ง ํ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. Default : ๊ธฐ๋ณธ์ ์ธ ๋คํธ์ํน ์ ์ฑ ์ ์ฌ์ฉํฉ๋๋ค. Ephemeral : ์ฟ ํค์ ์บ์๋ฅผ ์ ์ฅํ์ง ์์ ๋ ์ฌ์ฉํฉ๋๋ค. Background : ์ฑ์ด background์ ์์ ๋ ์ปจํ ์ธ ๋ฅผ ๋ค์ด๋ก๋ ํน์ ์ ๋ก๋ ํ ๋ ์ฌ์ฉํฉ๋๋ค. URLSessionTask ๋ํ ์์ ์ ๋ฐ๋ผ ์ธ๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค. URLSessionDataTask : ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์์ ์ํ ์ ์ฌ์ฉํฉ๋๋ค. background ์ธ์ ์ ๋ํ ์ง์์ ํ์ง ์์ต๋๋ค. URLSessionUploadTask : ๋ฐ์ดํฐ ์ ๋ก๋ ์ ์ฌ์ฉํฉ๋๋ค. URLSessionDownloadTask : ๋ฐ์ดํฐ ๋ค์ด๋ก๋ ์ ์ฌ์ฉํฉ๋๋ค.
-
prepareForReuse์ ๋ํด์ ์ค๋ช ํ์์ค.
ํ ์ด๋ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ณดํต ์ ์ ์ฌ์ฌ์ฉํ๋ค. ๋๋ฌธ์ ์ฌ์ฌ์ฉ๋ ์ ์์ ๋ณด์ฌ์ฃผ์ง ์์์ผ ํ๋ ํ ์คํธ ํน์ ๋ฒํผ ๋ฑ์ด ๋ณด์ฌ์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ ์ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ ๋ชจ๋ ๊ฐ์ด ์ด๊ธฐํ ๋์ด์ ธ์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ด๊ธฐํ๋ฅผ ํ๊ธฐ ์ํด ํธ์ถํ๋ ํจ์๊ฐ prepareForReuse์ด๋ค.
-
๋คํฌ๋ชจ๋๋ฅผ ์ง์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ์์ค.
-
ViewController์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ค๋ช ํ์์ค.
-
TableView์ CollectionView์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
UIScrollView์ ์๋ธํด๋์ค๋ก ๋ฌดํํ ์์(unbounded) ์ ๋ณด์ ๋ฌดํํ ์ ๊ทผ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ํ์ง๋ง ์๋ฃ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ๋ฐ์ํฉ๋๋ค. Table View: ์ ๋ณด๋ฅผ ํ๋์ ๊ธด ๋ฆฌ์คํธ๋ก ๋ณด์ฌ์ค๋๋ค(์น์ ๋ถ๋ฆฌ๋ ๊ฐ๋ฅํฉ๋๋ค). Collection View: ๋ค์ํ ๋ฐฉ์์ด ๊ฐ๋ฅํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก text flow ํ์์ผ๋ก ๋ณด์ฌ์ค๋๋ค. ์ฌ๊ธฐ์ text flow๋ ๊ธ์ ์ฝ๋ฏ์ด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ค๋ก ์ด์ด์ ๊ณ์ ์์ฑํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. ์ปฌ๋ ์ ๋ทฐ๋ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํฉ๋๋ค.
-
์คํ ๋ ์ด์์์ ์ฝ๋๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ๊ฐ? (3๊ฐ์ง)
- Layout Anchors
// Get the superview's layout let margins = view.layoutMarginsGuide // Pin the leading edge of myView to the margin's leading edge myView.leadingAnchor.constraint(equalTo: margins.leadingAnchor).isActive = true // Pin the trailing edge of myView to the margin's trailing edge myView.trailingAnchor.constraint(equalTo: margins.trailingAnchor).isActive = true // Give myView a 1:2 aspect ratio myView.heightAnchor.constraint(equalTo: myView.widthAnchor, multiplier: 2.0).isActive = true
- NSLayoutConstraint Class 1 ์ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ๋ ์ด์์์ ์ํฅ์ ์ฃผ์ง ์๋๋ผ๋ ๊ฐ ๋งค๊ฐ ๋ณ์์ ๋ํ ๊ฐ์ ์ง์ ํด์ผ ํ๋ค.
NSLayoutConstraint(item: myView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leadingMargin, multiplier: 1.0, constant: 0.0).isActive = true NSLayoutConstraint(item: myView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailingMargin, multiplier: 1.0, constant: 0.0).isActive = true NSLayoutConstraint(item: myView, attribute: .height, relatedBy: .equal, toItem: myView, attribute:.width, multiplier: 2.0, constant:0.0).isActive = true
- Visual Format Language ๋ฌธ์์ด๊ณผ ๊ฐ์ ASCII๋ฅผ ์ด์ฉํด ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํ ์ ์์
let views = ["myView" : myView] let formatString = "|-[myView]-|" let constraints = NSLayoutConstraint.constraints(withVisualFormat: formatString, options: .alignAllTop, metrics: nil, views: views) NSLayoutConstraint.activate(constraints)
-
hugging, resistance์ ๋ํด์ ์ค๋ช ํ์์ค.
-
Content hugging
- ๋์ด๋์ง ์์ผ๋ ค๊ณ ํ๋ ํ, ์ต๋ ํฌ๊ธฐ์ ์ ํ์ ๋๋ ๊ฒ. ๋ทฐ๋ฅผ ์์ชฝ์ผ๋ก ๋น๊ฒจ ์ฝํ ์ธ ์ฃผ๋ณ์ ๊ผญ ๋ง๋๋ก ํ๋ค.
-
Compression resistance
- ์ธ๋ถ์์ ์๋ ฅ์ ์ค ๋ ๋ฒํฐ๋ ํ, ์ต์ ํฌ๊ธฐ์ ์ ํ์ ๋๋ ๊ฒ. ์ฝํ ์ธ ๋ฅผ ์๋ฅด์ง ์๋๋ก ๋ทฐ๋ฅผ ๋ฐ๊นฅ์ชฝ์ผ๋ก ๋ฐ์ด๋ธ๋ค.
Right Label Content Hugging Priority = 750 Left Label Content Hugging Priority = 750
-
-
Intrinsic Size์ ๋ํด์ ์ค๋ช ํ์์ค.
-
์คํ ๋ฆฌ๋ณด๋๋ฅผ ์ด์ฉํ์๋์ ์ฅ๋จ์ ์ ์ค๋ช ํ์์ค.
-
Safearea์ ๋ํด์ ์ค๋ช ํ์์ค.
-
Left Constraint ์ Leading Constraint ์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
-
struct์ class์ enum์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค.
ํํ ๊ตฌ์กฐ์ฒด, ํด๋์ค, ์ด๊ฑฐํ์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์ ๋ ์ฌ๋ฆด ๋ ๊ฐ์ฅ ๋จผ์ ์๊ฐ๋๋ ๊ฒ์ด ํ์ ์ ์ฐจ์ด์ด๋ค. ๋ณดํต ๊ตฌ์กฐ์ฒด์ ์ด๊ฑฐํ์ ๊ฐํ์ , ํด๋์ค๋ ์ฐธ์กฐํ์ ์ด๋ผ๊ณ ํ๊ณ , ์ด ์ฐจ์ด์ ๋๋ฌธ์ ์ ์ค์ ์ด๋ค ๊ฒ์ ์ฐ๋๋์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ด ์๋ํ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค. ์ฃผ๋ก ๋์ผํ ํด๋์ค ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฌ๋ฌ ๋ณ์๋ค์ด ์์ ๋ ํ๋์ ๋ณ์๋ฅผ ํตํด ํด๋์ค์ ์ ๊ทผํด์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ๋ชจ๋ ๋ณ์๋ค์ด ๊ฐ๋ฆฌํค๋ ํ๋์ ์ธ์คํด์ค ๋ด๋ถ ์์ฒด๊ฐ ๋ฐ๋๊ฒ ๋๊ณ , ๊ฐ ํ์ ์ ๋์ ๊ณผ์ ์์ ๊ฐ์ ๋ณต์ฌ๊ฐ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ฒด ๋ณ์๋ค์ด ๋ชจ๋ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฒ๋๋ค.
class Person {
var name: String
init(name: String) {
self.name = name
}
}
var p1 = Person(name: "Jason")
var p2 = p1
p1.name = "Daniel" // p2.name ๋ํ Daniel์ผ ๊ฒ
struct Person {
var name: String
init(name: String) {
self.name = name
}
}
var p1 = Person(name: "Jason")
var p2 = p1
p1.name = "Daniel" // p2.name์ ์ฌ์ ํ Jason!
๊ฐ์ฅ ๋ํ์ ์ธ ์ฐธ์กฐํ์ ๊ณผ ๊ฐํ์ ์ ์ฐจ์ด์ ์ด์ง๋ง ์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ๊ฒ์ด ์๋ค. ๊ตฌ์กฐ์ฒด๋ ํญ์ ๊ฐํ์ ์ธ๊ฐ? ๋ผ๋ ์ง๋ฌธ์๋ โ์๋๋คโ๊ฐ ๋ต์ด๋ค. ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ์ฐธ์กฐํ์ ๋ณ์๊ฐ ์์ ์๋ ์๊ณ , 16 byte ์ด์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ฉด ๊ตฌ์กฐ์ฒด๋ ํ ์์ญ์ ์์ฑ๋จ์ผ๋ก์จ ์ฐธ์กฐํ์ ์ด๋ค.
Mixed Types ๋จผ์ ํด๋์ค ๋ด์ ๊ตฌ์กฐ์ฒด๊ฐ ํฌํจ๋๋ ๊ฒฝ์ฐ์ ๋ํด ์๊ฐํด๋ณด์.
struct Manufacturer {
var name: String
}
class Device {
var name: String
var manufacturer: Manufacturer
init(name: String, manufacturer: Manufacturer) {
self.name = name
self.manufacturer = manufacturer
}
}
let apple = Manufacturer(name: "Apple")
// ์ฌ๊ธฐ์ iPhone, iPad ๋ "ํด๋์ค"๋ ๋์ผํ๊ฒ apple์ด๋ผ๋ "๊ตฌ์กฐ์ฒด"๋ฅผ ์์ฑ์ผ๋ก ๊ฐ๊ฒ๋๋ค
let iPhone = Device(name: "iPhone", manufacturer: apple)
let iPad = Device(name: "iPad", manufacturer: apple)
iPad.manufacturer.name = "Google"
print(iPhone.manufacturer.name) -> Apple
print(iPad.manufacturer.name) -> Google
์ด๋ ๊ฝค ์ง๊ด์ ์ผ๋ก ์ดํด๊ฐ ๋๋ค. ์ ์ด์ ๊ตฌ์กฐ์ฒด๊ฐ ๊ฐ ํ์ ์ด๋ iPhone, iPad๋ผ๋ ๋ ํด๋์ค๊ฐ init ๋ ๋ ๊ฐ์ ๋ณต์ฌ๋ฅผ ํตํด ์์ฑ์ ์ ์ฅํ์ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ตฌ์กฐ์ฒด ๋ด์ ํด๋์ค๊ฐ ํฌํจ๋๋ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น?
class Engine: CustomStringConvertible {
var description: String {
return "\(type) Engine"
}
var type: String
init(type: String) {
self.type = type
}
}
struct Airplane {
var engine: Engine
}
let jetEngine = Engine(type: "Jet")
// ์ฌ๊ธฐ์ jetEngine์ด๋ผ๋ "์ฐธ์กฐํ์
๋ณ์"๋ฅผ ๋ airplane ๊ตฌ์กฐ์ฒด๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋ณต์ฌํด๊ฐ๋๋๊ฐ ๊ด๊ฑด์ด๋ค
let bigAirplane = Airplane(engine: jetEngine)
let littleAirplane = Airplane(engine: jetEngine)
littleAirplane.engine.type = "Rocket"
print(bigAirplane) -> Rocket Engine
print(littleAirplane) -> Rocket Engine
์ฐธ์กฐํ์ ์ ๋ฐ๋ก ๋ณต์ฌํ์ฌ ์ด๊ธฐํ๋๋ ๊ฒ์ด ์๋๋ผ ๋ ๊ตฌ์กฐ์ฒด๊ฐ ํ๋์ Engine ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ค.
์ด๊ฑฐํ
- ๋จผ์ ์ด๊ฑฐํ์ switch statement์ ๋ง๋ ๋ ๋งค์ฐ ๊ฐ๋ ฅํด์ง๋ค. ์ฝ๋์ ๊ฐ๋
์ฑ์ด ๋์์ง๊ณ , ๊ฐ๊ฒฐํด์ง๋ค.
- ๋ฌด์๋ณด๋ค enum case์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฅ์ ์ ์ปดํ์ผ ํ์์ ์๋ฌ๋ฅผ ํ์ธํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ฐฐ์ด์ด๋ ๋์
๋๋ฆฌ ๋ฑ์ ์์๊ฐ ๋ฐ๋๊ฑฐ๋ nil๊ฐ์ด ๋ค์ด์๋ ๋ฑ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ฌ์ง๊ฐ ์์ง๋ง ์ด๊ฑฐํ์ ๊ฒฝ์ฐ ์ด๋ฐ ์ค๋ฅ๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์ก์์ค๋ค.
- ๊ตฌ์กฐ์ฒด๋ก ์ด๊ฑฐํ์ ๊ธฐ๋ฅ์ ์ธ ์์๋ ๋์ํ ์ ์๊ฒ ์ง๋ง ๊ตฌ์กฐ์ฒด ๋ด์ ๋ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ initํ์ง ์์ผ๋ฉด ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ฉด ์ด๊ฑฐํ์ ์์ฑํ์ง ์๊ณ ์์๋ก ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ค์ด์ ธ์๊ธฐ ๋๋ฌธ์ ์ค์์ ์ฌ์ง๊ฐ ์ค์ด๋ ๋ค.
- ์ด๊ฑฐํ์ ๊ฐ case๊ฐ ๋นํธ๋จ์์ ๊ณ ์ ๊ฐ์ ๊ฐ๊ธฐ์ ๋น๊ต๊ฐ ๋น ๋ฅด๋ค. ๋น๊ต๋ฌธ์์์ ์ฅ์ ๋ ๊ฐ๋ ๊ฒ์ด๋ค.
- ์ด๊ฑฐํ ํ์
์ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๋ฉด ํ์ฅ์ฑ ์ธก๋ฉด์์ ๋ถ๋ฆฌํ๋ค. ์ด๊ฑฐํ์ด ์์ ๋๋ฉด ๋ชจ๋ ์์ค๋ค์ ๋งค๋ฒ ๋ค์ ์ปดํ์ผํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
-
class์ ์ฑ๋ฅ์ ํฅ์ ์ํฌ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ๋์ดํด๋ณด์์ค.
-
Convinience init์ ๋ํด ์ค๋ช ํ์์ค.
Designated init์ Swift์ ์ด๊ธฐํ ์ด๋์ ๋ผ์ด์ ์ ๋๋ค. init์ ํ๋ผ๋ฏธํฐ์์ ํด๋์ค ํ๋กํผํฐ๊ฐ ํ๋๋ผ๋ ๋น ์ง๊ฒ๋๋ฉด,
์ด๋ ๊ฒ ์ค๋ฅ๋ฅผ ๋ด๊ฒ ๋ฉ๋๋ค. convenience init์ "๋ณด์กฐ ์ด๋์ ๋ผ์ด์ " ์ ๋๋ค. Designated init์ ํ๋ผ๋ฏธํฐ ์ค ์ผ๋ถ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํด์, ์ด convenience init์์์ Designated init์ ํธ์ถ ํ์ฌ ์ด๊ธฐํ๋ฅผ ์งํํ ์ ์์ด์ convenience init์ ์ฌ์ฉํ๋ ค๋ฉด Designated init์ด ๊ผญ ๋จผ์ ์ ์ธ ๋์ด์ ธ์ผ ํฉ๋๋ค. class Person { var name: String var age: Int var gender: String init(name: String, age: Int, gender: String) { self.name = name self.age = age self.gender = gender } convenience init(age: Int, gender: String) { self.init(name: "name", age: age, gender: gender) } }
-
Anyobject์ ๋ํด ์ค๋ช ํ์์ค.
๋ชจ๋ ํด๋์ค ํ์ ์ ์ง์ ํ ์ ์๋ ํ๋กํ ์ฝ.
delegate ๋ณ์๋ฅผ ๋ง๋ค๋ ์ํ์ฐธ์กฐ๋ฅผ ๋ง๊ธฐ ์ํด weak ํค์๋๋ฅผ ์ฌ์ฉํ ๋๊ฐ ์๋๋ฐ, ์ด๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค. -
Optional ์ด๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
-
Struct ๊ฐ ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ค๋ช ํ์์ค.
๊ตฌ์กฐ์ฒด๋, ์ธ์คํด์ค์ ๊ฐ(ํ๋กํผํฐ)์ ์ ์ฅํ๊ฑฐ๋, ๊ธฐ๋ฅ(๋ฉ์๋)๋ฅผ ์ ๊ณตํ๊ณ ์ด๋ฅผ ์บก์ํํ ์ ์๋๋ก ์ค์ํํธ๊ฐ ์ ๊ณตํ๋ ํ์ ์ ๋๋ค
class์ ๋งค์ฐ ๋น์ทํ๋ฐ ์ฐจ์ด์ ์ ์ธ์คํด์ค๊ฐ ๊ฐํ์ (๋ณ์์ ์ ์ฅํ ๋๋ง๋ค ๊ฐ์ด ๋ณต์ฌ๋์ ๋ณ์์ ์ ์ฅ๋จ)์ด๊ณ ์์์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค. -
Subscripts์ ๋ํด ์ค๋ช ํ์์ค.
Class, Struct, Enum์์ collection, ์์ด, list, sequence ๋ฑ ์งํฉ์ ํน์ ๋ฉค๋ฒ ์์์ ์ฝ๊ฒ ์ ๊ทผํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค
์ธ์คํด์ค ์ด๋ฆ ๋ค์ ๋๊ดํธ๋ก ๊ฐ์ผ ๊ฐ์ ์จ์ค์ผ๋ก์จ ์ธ์คํด์ค ๋ด๋ถ์ ํน์ ๊ฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค- ์ฝ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅ
subscript(index: Int) -> Int { get { // ์ ์ ํ ๋ฐํ ๊ฐ } set(newValue) { // ์ ์ ํ set ์ก์ } }
- ์ฝ๊ธฐ ์ ์ฉ
subscript(index: Int) -> Int { // ์ ์ ํ ๋ฐํ ๊ฐ }
- ์ฌ์ฉ ์์
struct TimesTable { let multiplier: Int subscript(index: Int) -> Int { return multiplier * index } } // TimesTable๊ตฌ์กฐ์ฒด์ multiplier๋ฅผ 3์ผ๋ก ์ค์ let threeTimesTable = TimesTable(multiplier: 3) print("six times three is \(threeTimesTable[6])") // "six times three is 18" ์ถ๋ ฅ
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4] numberOfLegs["bird"] = 2
numberOfLegs๊ฐ์ ํ์ ์ถ๋ก ์ ์ํด [String: Int]ํ์ ๊ฐ์ต๋๋ค. numberOfLegs["bird"] = 2๋ ์ฌ์ ํ ๋ณ์ numberOfLegs์ key๋ก bird๋ฅผ ๊ทธ ๊ฐ์ 2๋ฅผ ๋ฃ์ผ๋ผ๋ ์๋ธ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๋๋ค.
-
instance ๋ฉ์๋์ class ๋ฉ์๋์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
instance ๋ฉ์๋.
ํน์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ์ธ์คํด์ค์ ์ํ๋ ํจ์
์ธ์คํด์ค ํ๋กํผํฐ ์ ๊ทผ ๋ฐ ์์ ์ ์ ๊ณตํ๊ฑฐ๋ ์ธ์คํด์ค์ ๋ชฉ์ ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.class Person { var name: String? func changeName(name: String) { self.name = name } } var personA = Person() personA.changeName(name: "jeff")
class ๋ฉ์๋
ํ์ ๋ฉ์๋๋ ํน์ ํ์ ์์ฒด์ ํธ์ถํด์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ static, class ๋ฉ์๋๊ฐ ์๋ค.
class ๋ฉ์๋๋ ํด๋์ค์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ struct, enum ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๋ค.
static ํค์๋๋ ์๋ธ ํด๋์ค์์ override ๋ถ๊ฐ๋ฅํ๊ณ , class ๋ฉ์๋๋ ๊ฐ๋ฅํ๋ค.struct Method { static func staticMethod() { print("static method") } class func classMethod() { print("class method") } } Method.staticMethod()
-
Delegate ํจํด์ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฅผ ๋ค์ด ์ค๋ช ํ์์ค.
-
Singleton ํจํด์ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฅผ ๋ค์ด ์ค๋ช ํ์์ค.
์ฑ๊ธํค ํจํด์ ํน์ ์ฉ๋๋ก ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑํด์ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ธ์คํด์ค๊ฐ ํ๋๋ง ์กด์ฌํ๋ ๊ฒ์ ๋ณด์ฆํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ ์ฃผ๋ก ํ๊ฒฝ์ค์ , ๋คํธ์ํฌ ๊ฐ์ฒด, ๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ์ ์ฉ๋์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
-
KVO ๋์ ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
Key Value Observing.
KVO๋ A๊ฐ์ฒด์์ B๊ฐ์ฒด์ ํค์ ๊ฐ์ด ๋ณํ๋จ์ ๊ฐ์งํ ์ ์๋ ํจํด์ ๋๋ค.๋ณ์์ ์ฝ๋๋ฅผ ๋ถ์ฌ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฝ๋๊ฐ ์คํ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค.
Objective-C ๋ฐํ์์ ์์กด, NSObject๋ฅผ ์์๋ฐ๋ ํด๋์ค์์ ์ฌ์ฉ๊ฐ๋ฅ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ด ๊ทธ ๊ฐ์ฒด์ ์์ฑ์ด ๋ณ๊ฒฝ๋๊ฒ์ ์ ์ ์๋ค@objc dynamic
์ ์ธ์ด ํ์.
keyPath๋ฅผ ์ด์ฉํด์ ์ํ๋ ์์ฑ์ ์ต์ ๋ฒ๋ฅผ ๋ฑ๋กํ๊ณ ์ค์ ๋ ๊ฐ์ฒด์ ์์ฑ์ด ๋ณ๊ฒฝ๋ฌ๋ค๋ฉด ๋ฑ๋ก๋ ์ต์ ๋ฒ ๋ฑ๋ก๋ ํด๋ก์ ๊ฐ ์คํ.
๋ฉ์๋๋ ๋ค๋ฅธ ์ก์ ์์ ๋ํ๋๋ ๊ฒ์ด ์๋๋ผ, ํ๋กํผํฐ์ ์ํ์์ ๋ฐ์ํ๋ ํํ. -
Delegates์ Notification ๋ฐฉ์์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ์์ค.
Delegate๋ ํ ํ๋ฉด์์ ๋ง์ ์ด๋ฒคํธ์, ํด๋น๋๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํ ๋ ์ฐ๋ฉด ์ ํฉํ๋ค๊ณ ์๊ฐํด์.
Notification์ ํ ์ด๋ฒคํธ์ ๋ํด ๋ค์์ ์์ ์๊ฐ ์์ ๊ฒฝ์ฐ์ ์ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
depth๊ฐ ๊น์ ํ๋ฉด์ ์ด๋ฒคํธ๋ฅผ ์ค ๋ ์ข์ ๊ฒ ๊ฐ์์.depth๊ฐ ๊น๋ค๋ฉด Delegate๋ฅผ ์ฑํํ๊ณ ๊ฐ์ฒด๋ฅผ ๋ด์ ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ณผ์ ์ด ๋ณต์กํ๋ค๊ณ ์๊ฐํด์. -
๋ฉํฐ ์ฐ๋ ๋๋ก ๋์ํ๋ ์ฑ์ ์์ฑํ๊ณ ์ถ์ ๋ ๊ณ ๋ คํ ์ ์๋ ๋ฐฉ์๋ค์ ์ค๋ช ํ์์ค.
Q. ๋ฉํฐ ์ค๋ ๋ฉ์ ์ฌ์ฉํ๋ ์ด์ A. ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์งํ ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํ์ ๋ฐฉํดํ๋ฉด ์๋๊ธฐ์ ๋ฉํฐ ์ฝ์ด์์ ํฐ ์์ ์ ์ฌ๋ฌ๊ฐ๋ก ๋ถํ ํ์ฌ ์งํํ๋ค. Q. ๋ฉํฐ ์ฐ๋ ๋๋ก ๋์ํ๋ ์ฑ์ ์์ฑํ๊ณ ์ถ์ ๋ ๊ณ ๋ คํ ์ ์๋ ๋ฐฉ์๋ค์ ์ค๋ช ํด์ฃผ์ธ์ A. ์ด๋ค ์์ ์ ๊ธ๋ก๋ฒ ํ์ ๋ฃ์ด์ผ ํ๋์ง ์ ํํ ์๊ณ , ๊ธ๋ก๋ฒ ํ์ ์์ ์ ๋ฐฐ์นํ ๋, ์์ ์ ๋ฐ๋ผ QoS๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํดํ๋ค. QoS๋? global queue๋ฅผ ์ฌ์ฉํ ๋ ์์ ๋ง๋ค ์ค์๋๋ฅผ ๋งค๊ฒจ์ ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ ๊ฒ. userInteractive ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ก, user-interativeํ ์์ ์ ์ํ ๊ฒ ์ : ์ ๋๋ฉ์ด์ , ์ด๋ฒคํธ ํธ๋ค๋ฌ, UI ์ ๋ฐ์ดํธ userInitiated ๋๋ฒ์งธ ์ฐ์ ์์๋ก, ์ฌ์ฉ์๊ฐ ํ๋ ๊ฒ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๋ณด์ฌ์ค์ผํ๋ ์์ , ์ฌ์ฉ์๊ฐ ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์์ง๋ ๋ชจ๋ฅด๋ ์์ ์ ์ํ ๊ฒ ์ : API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ utility ๋ค๋ฒ์งธ ์ฐ์ ์์, ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ง ์๋ ์์ ์ ์ํ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ํ ๊ฒฝ์ฐ background ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์, ์ฑ์ด ์คํ๋๋ ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ๊ณ ์ถ์ ์์ ์ ์ํ ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ Synchronous VS Asynchronous Async ๋น๋๊ธฐ - ์๊ธฐ๋ค๋ฆผ - ์์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ return - ๋ฉ์ธ ์ค๋ ๋์์ ๋ค๋ฅธ ์ค๋ ๋์ ์ผ์ ๋๊ธฐ๊ณ ์์ ์๋ฃ๊น์ง ๋๊ธฐํ์ง ์๋๋ค. Sync ๋๊ธฐ - ๊ธฐ๋ค๋ฆผ - ๋ฐ๋ผ์ ๋ค๋ฅธ ์ค๋ ๋๋ก ๋ณด๋ด๋ ์๋ฏธ๊ฐ ์๋ค. ํญ์ ๋ฉ์ธ ์ค๋ ๋์์ ์์ ์ ์งํํ๋ค. Serial VS Concurrent Serial (์ง๋ ฌ ํ) ๋ถ์ฐ์ฒ๋ฆฌ ์ํจ ์์ ์ ๋ค๋ฅธ ํ ๊ฐ์ ์ค๋ ๋์์ ์์๊ฐ ์ค์ํ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
Concurrent (๋์ ํ) ๋ถ์ฐ์ฒ๋ฆฌ ์ํจ ์์ ์ ๋ค๋ฅธ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋์์ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ด์ง๋ง ์ ์ฌํ ์ฌ๋ฌ๊ฐ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
-
MVC ๊ตฌ์กฐ์ ๋ํด ๋ธ๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ณ , ๊ฐ ์ญํ ๊ณผ ํ๋ฆ์ ์ค๋ช ํ์์ค.
Model - ๋ฐ์ดํฐ ๊ด๋ฆฌ - ์ฑ์ด ํฌํจํด์ผ ํ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ์ง ์ ์ # View - ๋ ์ด์์๊ณผ ํ๋ฉด ์ฒ๋ฆฌ - ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ ์ ์ # Controller - ๋ช ๋ น์ ๋ชจ๋ธ๊ณผ ๋ทฐ ๋ถ๋ถ์ผ๋ก ๋ผ์ฐํ - ์ฑ์ ์ฌ์ฉ์๋ก๋ถํฐ์ ์ ๋ ฅ์ ๋ํ ์๋ต์ผ๋ก ๋ชจ๋ธ ๋ฐ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ก์ง์ ํฌํจ
-
ํ๋กํ ์ฝ์ด๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
ํ๋กํ ์ฝ(Protocol) ์ ํน์ ์ญํ ์ ์ํํ๊ธฐ ์ํ ๋ฉ์๋, ํ๋กํผํฐ, ๊ธฐํ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง์ ์ ์ํฉ๋๋ค.
-
Hashable์ด ๋ฌด์์ด๊ณ , Equatable์ ์ ์์ํด์ผ ํ๋์ง ์ค๋ช ํ์์ค.
Hashable์ด๋ Set, Dictionary์ Key์ ๊ฐ์ด ์์์ ์๋ฃํ์ ์ ์์ ๊ฐ์ผ๋ก ๋ณํํ์ฌ ๊ฐ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ ์ ๊ฐ์ ํตํด ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋ค. Hashable์ด Equatable ํ๋กํ ์ฝ์ ์ค์ํ์ฌ์ผ ํ๋ ์ด์ ๋ Hashable์ ํตํด์ ๋ณํ๋ ์ ์์ ๊ฐ์ ๋ฐํ์ผ๋ก ์ธ์คํด์ค๋ฅผ ๋น๊ตํ์ฌ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
-
mutating ํค์๋์ ๋ํด ์ค๋ช ํ์์ค.
ํด๋์ค๋ reference ํ์ ์ด๊ณ struct ์ enum์ value ํ์ ์ ๋๋ค. value ํ์ ์ ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค ๋ฉ์๋ ๋ด์์ ์์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ ์์ ํด์ผํ๋ ๊ฒฝ์ฐ mutating ์ ๋ถ์ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
=> The point is now at 2.0, 3.0
- ํ์ถ ํด๋ก์ ์ ๋ํ์ฌ ์ค๋ช
ํ์์ค.
ํ์ถ ํด๋ก์ ๋? ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ํด๋ก์ ๊ฐ ํจ์๊ฐ ๋ฐํ๋ ํ ์คํ๋๋ ํด๋ก์ ๋ฅผ ์๋ฏธ. ์ด ๊ฒฝ์ฐ @escaping ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค. ์ฌ์ฉํ๋ ์ด์ ๋ณดํต์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํด๋ก์ ๋ฅผ ํ์ถ ์ํต๋๋ค. func getSumOf(array:[Int], handler: @escaping ((Int)->Void)) { var sum: Int = 0 for value in array { sum += value } DispatchQueue.global().asyncAfter(deadline: .now() + 1.0){ handler(sum) } } Alamofire.request(urlRequest).responseJSON { response in }
- Extension์ ๋ํด ์ค๋ช
ํ์์ค.
์ด์ ์ ๋ด๋ถ ์์ค๋ฅผ ์ ๊ทผํ ์ ์๋ ์๋ณธ ํ์ ๋ค์ ๋ํด ์๋ก์ด ๊ธฐ๋ฅ์ ๋ถ์ฌํ ์ ์๋ ๋ฐฉ๋ฒ ๊ตฌ์กฐ์ฒด, ํด๋์ค, ์ด๊ฑฐํ, ํ๋กํ ์ฝ์ ์ถ๊ฐ ๊ตฌํ๋ถ, ์ ์ฝ์ฌํญ, ๊ธฐ๋ฅ ๋ฑ์ ์ ์ ํน์ ํ์ ์ ๊ธฐ๋ฅ ๋ฐ ์ค์ํ๋ ํ๋กํ ์ฝ๋ณ ๊ตฌํ๋ถ๋ฅผ ๋ถ๋ฆฌํด์ ๋ณด๋ค ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์.
- ์ ๊ทผ ์ ์ด์์ ์ข
๋ฅ์ ์ด๋ค๊ฒ ์๋์ง ์ค๋ช
ํ์์ค
- open, public ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅ open ์ ํด๋์ค์ ํด๋์ค ๋ฉค๋ฒ์๋ง ์ ์ฉ ๊ฐ๋ฅํ๊ณ , ์ธ๋ถ์์ ์๋ธํด๋์ฑ ๋ฐ ์ค๋ฒ๋ผ์ด๋๊ฐ ๊ฐ๋ฅํด ๊ทธ์ ๋ฐ๋ฅธ ์ํฅ์ ๊ณ ๋ คํด์ผ ํจ - internal ๋ชจ๋ ์์์๋ ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, ์ธ๋ถ์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ ์ฑ์ด๋ ํ๋ ์์ํฌ ๋ด๋ถ ์ค๊ณ๋ฅผ ์ ์ํ ๋ ๋ณดํต ์ฌ์ฉ ๋ํดํธ - file-private ์ ์๋ ํ์ผ ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ - private ๊ฐ์ฅ ๋์ ์ ํ. ์ ์ธ๋ ๊ณณ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ.
- defer๋ ๋ฌด์์ธ์ง ์ค๋ช
ํ์์ค.
defer๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
ํ์ฌ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ๊ฒฝ์ฐ์ ์คํ๋จ.
- defer๊ฐ ํธ์ถ๋๋ ์์๋ ์ด๋ป๊ฒ ๋๊ณ , defer๊ฐ ํธ์ถ๋์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์ค๋ช ํ์์ค.
- property wrapper์ ๋ํด์ ์ค๋ช ํ์์ค.
- Generic์ ๋ํด ์ค๋ช ํ์์ค.
- Resultํ์ ์ ๋ํด ์ค๋ช ํ์์ค.
- Codable์ ๋ํ์ฌ ์ค๋ช ํ์์ค.
- ARC๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
ARC๋ Automatic Referencing Counting์ ์ค๋ง์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ '์ฐธ์กฐ ์นด์ดํธ'๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ฃผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ด๋ค.
ARC๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋ ๋๋ง๋ค ์ฐธ์กฐ ์นด์ดํธ(Reference Count)๋ฅผ 1์ฉ ์ฆ๊ฐ์ํต๋๋ค.
๊ทธ ๋ค์๋ 'nil์ด ํ ๋น๋๊ฑฐ๋, ๋ณ์์ ์๋ช
์ฃผ๊ธฐ๊ฐ ๋๋๊ฑฐ๋, ์ํด ์๋ class๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋' ์ฐธ์กฐ ์นด์ดํธ๋ฅผ 1 ๊ฐ์์ํค๋ฉด์
์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
- Retain Count ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
- Strong ๊ณผ Weak ์ฐธ์กฐ ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
- ์ํ ์ฐธ์กฐ์ ๋ํ์ฌ ์ค๋ช ํ์์ค.
- ๊ฐํ ์ํ ์ฐธ์กฐ (Strong Reference Cycle) ๋ ์ด๋ค ๊ฒฝ์ฐ์ ๋ฐ์ํ๋์ง ์ค๋ช ํ์์ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ input์ ์ ๋ฌ ๋ฐ๊ณ output์ ๋ด๋ ํจ์๋ค์ ์ด์ด ๋ถ์ฌ์ ์ํ๋ ๋ฐฉ์๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ ํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋งํ๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง
1. ์ธํ๊ณผ ์์ํ์ด ์๋ค.
- ์ธํ์ ๋ฃ์ผ๋ฉด ์์ํ์ด ๋์ค๊ณ , ํด๋น ์์ํ์ ์ด์ฉํด ๋ค์ ํจ์์ ๋๊ฒจ์ค๋ค. ์ด ์์
์ ๋ชจ๋ ํจ์๋ฅผ ๊ฑฐ์น ๋๊น์ง ๋ฐ๋ณตํ๋ค.
2. ์ธ๋ถ ํ๊ฒฝ์ผ๋ก ๋ถํฐ ์ฒ ์ ํ ๋
๋ฆฝ์ ์ด๋ค.
- ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ฌ๋ฆฌ ๋จ์ ์ฐธ์กฐํ๊ธฐ ์ํ ๋ณ์๋ฅผ ์์ฑํ์ง ์๋๋ค. ์ค๋ก์ง ์์ ๋ค์๊ฒ ์ฃผ์ด์ง๋ ์ธํ์ผ๋ก๋ง ์์
์ํด์ ์์ํ์ ๋ฐํํ๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ธํ์ ์์ด์๋ ์ธ์ ๋ ๋์ผํ ์์ํ์ ๋ฐํํด๋ธ๋ค. ์ธ๋ถ ์์ธ์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ฒ ์ ํ ๋ค์ด์ค๋ ์ธํ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ๋ง์ ๋ง๋ค์ด๋ด๊ณ
๋ค์ ํจ์๋ ์ญ์ ๋์ผํ ์ธํ์ ๋๊ฒจ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ์ด ํ๋ค๋ฆฌ์ง ์๋๋ค. ์ด๋ฐ๊ฑธ ๋ณด๊ณ ์์ํจ์๋ผ๊ณ ํ๋ค. ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ค์๋ง ์๋ค๋ฉด ๋์ผ ์ธํ์ ๋์ผ
์์ํ์ ๊ธฐ๋ํ ์ ์์ง๋ง, ์ฐธ์กฐํ๊ธฐ ์ํด ์ ์ธ ๋์ด์ก๋ ๋ณ์๊ฐ ๋ณ์๋ก ์์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฌ๋์ด ์ค์ํ ์ฌ์ง๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ธ๋ถ ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ผ๊ณ , ๊ทธ ๋ณธ์ฒด์ ์ง์ ์ ๊ทผํด์ ๋ณ๊ฒฝํ๋๊ฒ ์๋๋ผ ์ธ์๋ก ๋ฃ์ด์ ์ฌ๋ณธ์ผ๋ก ๋ณต์ฌํด๊ฐ ๋ค์์ ์์
ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์์
์ ํ๋
์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ชฉ์
๋ถ์ํจ๊ณผ ์์ด ์์ ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ ํ๋ก๊ทธ๋๋ฐ
- ๊ณ ์ฐจ ํจ์๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
ํจ์์ ์ธ์๋ก ํจ์๋ฅผ ์ทจํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ํจ์๋ก ๋ฐํํ๋ ํจ์
๋ํ์ ์ผ๋ก map, filter, reduce, compactMap, flatMap ์ด ์์.
- Swift Standard Library์ map, filter, reduce, compactMap, flatMap์ ๋ํ์ฌ ์ค๋ช ํ์์ค.
map - ์ปฌ๋ ์
๋ด๋ถ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์๋ก์ด ์ปฌ๋ ์
์ ์์ฑํ๋ ํจ์
filter - ์ปจํ
์ด๋ ๋ด๋ถ์ ๊ฐ์ ํํฐ๋งํ์ฌ ์ถ์ถํ๋ ํจ์
reduce - ์ถ์ฝ ์ํค๋ ํจ์. ํด๋ก์ ๋ฅผ ํตํด ๊ฐ ํญ๋ชฉ๋ค์ ๋น๊ตํ์ฌ ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ์ง ์์ํ ๋ฐํ
compactMap - 1์ฐจ์ ๋ฐฐ์ด์์ nil์ ์ ๊ฑฐํ๊ณ ์ต์
๋ ๋ฐ์ธ๋ฉ์ ํ๊ณ ์ถ์๋ ์ฌ์ฉ
flatMap - 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก flatten ํ๊ฒ ๋ง๋ค๋ ์ฌ์ฉ
-
MVVM, Ribs, VIP ๋ฑ ์์ ์ด ์๊ณ ์๋ ์ํคํ ์ณ๋ฅผ ์ค๋ช ํ์์ค. MVC MVVM MVP
-
์์กด์ฑ ์ฃผ์ ์ ๋ํ์ฌ ์ค๋ช ํ์์ค.
๊ฐ์ฒด A๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ธ B๋ฅผ ๋ด๋ถ์ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๊ฒ ๋๋ค๋ฉด B ๊ฐ์ฒด์ ๊ตฌํ๋ด์ฉ์ ๋ฐ๋ผ์ A ๊ฐ์ฒด์ ๋์์ ์ํฅ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ฐ ์ํฉ์์ A๊ฐ์ฒด๋ B๊ฐ์ฒด์ ์์กด๊ด๊ณ๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค. B๊ฐ์ฒด๋ฅผ A๊ฐ์ฒด ๋ด๋ถ๊ฐ ์๋๋ผ ์ธ๋ถ์์ ์์ฑํด์ ๋ฃ์ด์ฃผ๋๊ฒ์ '์์กด์ฑ์ ์ฃผ์ ํ๋ค' ๋ผ๊ณ ํฉ๋๋ค. ์ฅ์ ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ ์คํธ์ ์ฉ์ดํ๊ณ ์์กด์ฑ์ด ์ค์ด๋ญ๋๋ค.
์๋๋ถํฐ๋ ์ถ๊ฐ๋ก ๊ณต๋ถ๋ฅผ ํ๋ฉด ์ข์ ๋ด์ฉ๋ค์ ๋๋ค.
Objective-c๋ rx๋ ํ์ฌ, ํ๋ง๋ค ์ฌ์ฉํ๋๊ณณ์ด ์ฐจ์ด๊ฐ์๊ณ ์ ์ ์ด๋ ์ฃผ๋์ด๊ธฐ์ค์ผ๋ก ํ์๋ผ๊ณ ์ฌ๊ฒจ์ง์ง์๊ธฐ์ ์ต์ ๋์ ์ถ๊ฐํ์์ต๋๋ค.
- PassthroughSubject์ ๋ํด์ ์ค๋ช ํ์์ค
- @Published์ ๋ํด์ ์ค๋ช ํ์์ค
- Anycancleable์ ๋ํด์ ์ค๋ช ํ์์ค
- sink์ ๋ํด์ ์ค๋ช ํ์์ค
- Reactive Programming์ด ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
์ํ๋ ํ๋ฆ์ observable๋ก ๊ตฌํํ ๋ค์์,
์ด๋ฅผ ํ๊ณ ๋ด๋ ค์ค๋ ๋ฐ์ดํฐ๋ค์ ์คํผ๋ ์ดํฐ๋ก ์ ์ ํ๊ณ ,
๊ทธ ์ต์ข
๊ฐ์ ๊ตฌ๋
์๊ฐ ๋ฐ์์ ์ด๋ป๊ฒ ๋ฐ์ํด์ผํ ์ง ์ฝ๋ฉํด์ฃผ๋ ๊ฒ.
์์ํจ์๋ก ๊ฐ๊ณตํ ์ ์๋ ์คํธ๋ฆผ์ ๋ค๋ฃธ์ผ๋ก์จ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ ์ด ์ ์ฉ๋ ์ ์๋ ๋ฒ์๋ฅผ ํ์ฅํด์ค.
- RxSwift์์ Hot Observable๊ณผ Cold Observable์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค.
- Subject์ drive์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค.
Observable์ด error ํน์ complete๋ฅผ ๋ฌด์ํ๊ณ ์ถ์๋ Driver๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉํ๋ค.
MainScheduler์์ ์คํ๋๋ฏ๋ก ์ค๋ ๋๋ฅผ ์ ํํด ์ค ํ์ ์๋ค.
Subject์ Observable์ UI ์ฒ๋ฆฌ ๋ชฉ์ ์ผ๋ก ์ฃฝ์ง ์๋ ์คํธ๋ฆผ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- ARC ๋์ Manual Reference Count ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๋ ๊ผญ ์ฌ์ฉํด์ผ ํ๋ ๋ฉ์๋๋ค์ ์ฐ๊ณ ์ญํ ์ ์ค๋ช ํ์์ค.
- retain ๊ณผ assign ์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- ํน์ ๊ฐ์ฒด๋ฅผ autorelease ํ๊ธฐ ์ํด ํ์ํ ์ฌํญ๊ณผ ๊ณผ์ ์ ์ค๋ช ํ์์ค.
- Autorelease Pool์ ์ฌ์ฉํด์ผ ํ๋ ์ํฉ์ ๋ ๊ฐ์ง ์ด์ ์๋ก ๋ค์ด ์ค๋ช ํ์์ค.
- ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํ ๊น ์ถ์ธกํด์ ์ค๋ช ํ์์ค. Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
- method swizzling์ด ๋ฌด์์ด๊ณ , ์ด๋จ ๋ ์ฌ์ฉํ๋์ง ์ค๋ช ํ์์ค.
- NSCoder ํด๋์ค๋ ์ด๋ค ์ํฉ์์ ์ด๋ป๊ฒ ์จ์ผ ํ๋์ง ์ค๋ช ํ์์ค.
- Responder Chain ๊ตฌ์กฐ์ ๋ํด ์ค๋ช ํ๊ณ , First Responder ์ญํ ์ ๋ํด ์ค๋ช ํ์์ค.
- NSObject๋ถํฐ UIButton ๊น์ง ์์ ๊ณผ์ ์ ๊ณ์ธต๊ณผ ์ญํ ์ ์ค๋ช ํ์์ค.
- shallow copy์ deep copy์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- Push Notification ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
- Foundation ๊ณผ Core Foundation ํ๋ ์์ํฌ์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- NSURLConnection ์์ ์ฌ์ฉํ๋ Delegate ๋ฉ์๋๋ค์ ๋ํด ์ค๋ช ํ์์ค.
- Synchronous ๋ฐฉ์๊ณผ Asynchronous ๋ฐฉ์์ผ๋ก URL Connection์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ์ ์ฅ๋จ์ ์ ๋น๊ตํ์์ค.
- Plist ํ์ผ ๊ตฌ์กฐ์ Plist ํ์ผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ ํฉํ ํด๋์ค๋ฅผ ์ค๋ช ํ์์ค.
- Core Data์ Sqlite ๊ฐ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- JSON ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๊ณผ ํ์, ๊ฐ์ฒด ๋ณํ ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
- ์น ์๋ฒ์ HTTP ์ฐ๊ฒฐ์ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ฑฐ๋ ๋ฐ์ผ๋ ค๋ฉด ์ฌ์ฉํด์ผ ํ๋ ํด๋์ค์ ๋์์ ์ค๋ช ํ์์ค.
- Protocol์์๋ ์ var๋ง ๋๋์ง ์ค๋ช ํ์์.
- Swift์ ํด๋ก์ ์ Objective-C์ ๋ธ๋ก์ ์ด๋ค ์ฐจ์ด๊ฐ ์๋๊ฐ?
- Mutable ๊ฐ์ฒด๊ณผ Immutable ๊ฐ์ฒด๋ ์ด๋ค๊ฒ์ด ์๋์ง ์๋ฅผ ๋ค๊ณ , ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- dynamic๊ณผ property ์๋ฏธ์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ์์ค.
- @property๋ก ์ ์ธํ NSString* title ์ getter/setter ๋ฉ์๋๋ฅผ ๊ตฌํํด๋ณด์์ค.
- @property์์ atomic๊ณผ nonatomic ์ฐจ์ด์ ์ ์ค๋ช ํ๊ณ , ์ด๋ค๊ฒ์ด ์์ ํ์ง, ์ด๋๊ฒ์ด ๊ธฐ๋ณธ์ธ์ง ์ค๋ช ํ์์ค.
- @property๋ก ์ ์ธํ๋ค๋ ๊ฒ์ ์๋ฏธ๋ฅผ ์ค๋ช ํ๊ณ , .h์ ๋ฃ์ ๊ฒฝ์ฐ์ .m์ ๋ฃ์ ๊ฒฝ์ฐ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- -performSelector:withObject:afterDelay: ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ์ธ์๊ฐ์ ๊ฐ์ฒด๋ retain๋๋๊ฐ? ๊ทธ ์ด์ ๋ฅผ ํจ๊ป ์ค๋ช ํ์์ค.
- Objective-C ์์ ์บก์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ค์ ์ค๋ช ํ์์ค.
- Fast Enumeration ์ด๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
- unnamed category ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
- Category ํ์ฅ๊ณผ Subclass ํ์ฅ์ ์ฐจ์ด์ ์ ์ค๋ช ํ์์ค.
- Category ๋ฐฉ์์ ๋ํด ์ค๋ช ํ์์ค.
- Objective-C ์์ Protocol ์ด๋ ๋ฌด์์ธ์ง ์ค๋ช ํ์์ค.
- Objective-C++ ๋ฐฉ์์ด ๋ฌด์์ธ์ง ์ค๋ช ํ๊ณ , ์ด๋ค ๊ฒฝ์ฐ ์ฌ์ฉํด์ผ ํ๋์ง ์ค๋ช ํ์์ค.