- You can refer to it through the playground
- You can use swift
- Now Submit to Swift
- Objective-C ์swift์ฐจ์ด
- AppDelegate
- iOS Application State
- ViewController Life Cycle(์๋ช ์ฃผ๊ธฐ)
- Main run loop
- Update Cycle
- CoreAnimation
- CALayer
- iOS UIClassDiagram
[๋ฌธ๋ฒ]
- ๋ฐ์ดํฐ ํ์
- Tuple
- as
- is
- Any์ AnyObject
- ์ฐ์ฐ์
- ์ ์ด๋ฌธ
- ํจ์๊ธฐ์ด
- then(with: ์ ์์ด)
- Class
- ์์
- ์ ๊ทผ์ ์ด
- protocol
- enum: ์ด๊ฑฐํ
- struct
- ํด๋์ค/๊ตฌ์กฐ์ฒด,์ด๊ฑฐํ ๋น๊ต
- ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ&๊ด๋ฆฌ
- func
- inout
- Optional
- ์ค๋ฅ์ฒ๋ฆฌ
- Generic
- Delegate
- mutable/Immutable
- initializer
- MVC
- bundle
- Nib/Xib
- SDK์ API์ฐจ์ด
[Xcode]
[SwiftUI]
- swift๋ ios8์ ๊ฐ๋ฐ์ ์ฌ์ฉ๋จ.
- swift๋ ํ์ ์ถ์ , ํ์ ์ธ์ดํ๊ฐ ์ ๊ณต๋จ.(๋ช ์ํ ํ์ ์์ด์ง)
- swift๋ isEqual๋ฉ์๋๋ฅผ ์ด์ฉํ ํ์์์ด == ์ฐ์ฐ์๋ง์ผ๋ก ๋น๊ต๊ฐ๋ฅ.
- swift๋ switch๋ฌธ์ผ๋ก ๋ถ๊ธฐ๊ฐ ๊ฐ๋ฅํจ. objective-c๋ if๋ฌธ์ผ๋ก ์ฒ๋ฆฌํด์ผํ์.
- swift๋ Genericํ์ ์ ๊ณต.
- Objective-C๋ class, swift๋ struct ๊ธฐ๋ฐ์.
UIResponder
- http://blog.naver.com/hobin1019/221302910865
- UIKit app์ ์ด๋ฒคํธํธ๋ค๋ง์ ์ํด ์๋ ๊ฒ.
- UIApplication, UIViewController, UIView(UIWindow์ ์ผ์ข )์ด ๋ชจ๋ ์ด๋ฒคํธ responder์ ํฌํจ๋จ.
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด, UIKit๋ ๊ฐ๊ฐ์ responder์ค๋ธ์ ํธ๋ก ์ฒ๋ฆฌํ๊ฒ ์ํด
event
- ์ด๋ฒคํธ์๋ ํฐ์น์ด๋ฒคํธ, ๋ชจ์ ์ด๋ฒคํธ, ๋ฆฌ๋ชจํธ์ฝํธ๋กค์ด๋ฒคํธ, ๋๋ฅด๋ ์ด๋ฒคํธ๊ฐ ์๋๋ฐ, ํน์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด responder๋ ๋ฐ๋์ ํน์ ๋ฉ์๋๋ฅผ overrideํด์ผํจ.
- ์๋ฅผ๋ค๋ฉด, ํฐ์น์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด responder๋ touchesBegan, touchesMoved, touchesEnded, touchesCancelled๋ฅผ ๊ตฌํํด์ผํจ.
- ํฐ์น์ ๊ฒฝ์ฐ responder๋ UIKit๋ก๋ถํฐ ์ ๊ณต๋๋ ์ด๋ฒคํธ ์ ๋ณด๋ฅผ ์ฌ์ฉ.
- ํฐ์น์ ๋ํด ๋ฐ๋ ์ ์ ์ฐพ์ ์ ์๊ณ , ์ ์ ํ๊ฒ ์ฑ์ ์ธํฐํ์ด์ค์ ๋ฐ์ํ ์ ์๊ฒ๋จ.
UIkit responder
- UIkit responder๋ค์ ์ฒ๋ฆฌ๋์ง ์์ ์ด๋ฒคํธ๋ฅผ ๋น์ ์ app์ ๋ค๋ฅธ ๋ถ๋ถ์ผ๋ก ์ ๋ฌ ๋๊ธฐ๋ ํจ.
- ์ฃผ์ด์ง respinder์ด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด, ๋ค์ ์ด๋ฒคํธ responder ์ฒด์ธ์ผ๋ก ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋๊น. UIKit๋ responder์ฒด์ธ์ ๋์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ๋ฏธ๋ฆฌ ์ ํด์ง ๊ท์น์ ๋ฐ๋ผ ๋ค์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ฒ ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฒฐ์ ํ๋ค.
- ์๋ฅผ ๋ค๋ฉด, view๋ super view๋ก ์ ๋ฌํ๊ณ , root view๋ ViewController๋ก ์ ๋ฌํจ.
reponders๋ UIEvent์ค๋ธ์ ํธ๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, input view๋ฅผ ํตํ custom input์ ์ฒ๋ฆฌํ๊ธฐ๋ ํ๋ค. ํค๋ณด๋๊ฐ input view์ ํ ์์ด๋ค. ์ ์ ๊ฐ UITextField๋ UITextView๋ฅผ ํ๋ฉด์ ํญํ ๊ฒฝ์ฐ, view๋ ์ต์ด์ responder๊ฐ ๋๊ณ , ๊ทธ๊ฒ์ Input view(keyboard)๋ฅผ ๋ณด์ฌ์ค๋ค.
Respinding to touch events
- touchesBegan
- touchesMoved
- touchesEnded
- touchesCancelled
Respinding to Motion events
- motionBegan
- motionEnded
- motionCancelled
Respinding to press events
- pressesBegan
- presserChanged
- presserEnded
- presserCancelled
Respinding to remote-control events
- remoteControlRecieved
application: ์ฑ ์์ ์ ์ ํ์ํ ์์ ๋ค์ ์ฌ๊ธฐ์ ์์ฑ
applicationWillResignActive : ์ฑ์ด ๋นํ์ฑํ ๋๋ ๋จ๊ณ์ ๋ค์ด๊ฐ ๋ ์คํ๋๋ ๋ฉ์๋
applicationDidEnterBackground: ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ ๋ค์ด๊ฐ์ ๋ ์คํ๋๋ ๋ฉ์๋
applicationWillEnterForeground :์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ ํ๋ฉด์ผ๋ก ๋์ฌ ๋ ์คํ๋๋ ๋ฉ์๋
applicationDidBecomeActive : ์ฑ์ด ํ๋ฉด์ผ๋ก ๋์ค๊ณ ๋์ ์คํ๋๋ ๋ฉ์๋
applicationWillTerminate : ์ฑ์ด ์ข ๋ฃํ ๋ ์คํ๋๋ ๋ฉ์๋
Not Running : ์ฑ์ด ์คํ๋์ง ์์๊ฑฐ๋, ์์คํ ์ ์ํด ์ข ๋ฃ๋ ์ํ.
Active : ์ฑ์ด Foreground์์ ์คํ๋๊ณ ์๊ณ , ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ ์ํ.
Inactive : ์ฑ์ด Foreground์์ ์คํ๋๊ณ ์์ผ๋, ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ๋ชปํ๋ ์ํ
Background : ์ฑ์ด Foreground์์ ์คํ์ค์ธ ์ํ, Home๋ฒํผ์ ๋๋ ์ ๋ ์ผ์์ ์ผ๋ก Background์ํ๊ฐ ๋จ
Suspended : ์คํ์ด ์ค๋จ๋์ด ๋๊ธฐ์ค์ธ ์ํ, ์ ์๋์ Background์ํ๋ฅผ ๊ฑฐ์น ํ์ ์ด ์ํ๊ฐ ๋จ
loadView()
- ํ๋ฉด์ ๋์์ค view๋ฅผ ๋ง๋๋ ๋ฉ์๋๋ก view๋ฅผ ๋ง๋ค๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆผ.
- ์ค๋ช ์ ๋ณด๋ฉด, ์ด ๋ฉ์๋๋ ์ง์ ํธ์ถํ์ง ๋ง๋ผ๊ณ ์ฐ์ฌ์์.
- ๋ชจ๋๋ฅผ ์ง์ ์ ์ผ๋ก ์ฝ๋ฉํ์ฌ ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ overrideํ์ง ์๋ ๊ฒ์ด ์ข์. ์์ธํ ์ค๋ช ์ ์๋ ๋งํฌ
- https://leehonghwa.github.io/blog/loadView/
loadViewIfNeeded(iOS9์ด์)
- ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ทฐ๊ฐ ์์ง ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ๋ก๋
viewDidLoad
- ๋ทฐ์ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ ๋ ํ ํธ์ถ๋๋ฉฐ ์์คํ ์ ์ํด ์๋์ผ๋ก ํธ์ถ๋จ.
- ์ฌ์ฉ์๊ฐ ํ๋ฉด์ด ๋ณด์ฌ์ง๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ ค์ฃผ๋ ํ์์ ๋ํ ์ฝ๋๋ฅผ ์์ฑ ํ ์ ์์.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋, ์ด๊ธฐํ๋ฉด์ ๊ตฌ์ฑํ๋ ์ฉ๋๋ก ์ฐ์
- ViewController์์ ๋ฑ ํ ๋ฒ ํธ์ถ ๋๋ ๊ฒ์ด ํน์ง.
viewWillAppear
- ๋ทฐ ์ปจํธ๋กค๋ฌ์ ํ๋ฉด์ด ์ฌ๋ผ์ค๊ณ ๋ ํ ๋ทฐ๊ฐ ํ๋ฉด์ ๋ํ๊ฐ๊ธฐ ์ง์ ์ ํธ์ถ๋จ.
- ์ฆ, ๋ทฐ๊ฐ ๋ก๋๋ ํ ๋์ ๋ณด์ด๊ธฐ ์ ์ ์ปจํธ๋กค๋ฌ์๊ฒ ์๋ฆฌ๋ ์ญํ .
- ๋ค๋ฅธ ๋ทฐ๋ก ์ด๋ํ๋ค๊ฐ ๋๋์์ฌ ๋ ์ฌ ํธ์ถ๋๋ ๋ฉ์๋๋ก ํ๋ฉด์ด ๋ํ๋ ๋ ๋ง๋ค ์ํํด์ผํ๋ ์์ ์ ์ ์ํ๊ธฐ ์ข์.
- ์ฒ์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ํ ๋๊ณ ์ฒซ ํ๋ฉด์ด ๋์์ง ๋ ํธ์ถ๋๋ ๊ฒ์ viewDidLoad()์ ๋์ผํ์ง๋ง, ํ๋ฉด ์ ํ์ ํตํด ๋ค์ ํ์ฌ์ ํ๋ฉด์ผ๋ก ๋์์ฌ ๋ viewDidLoad๊ฐ ์๋ viewWillAppear๊ฐ ํธ์ถ๋จ.
viewDidAppear
- view๊ฐ ๋ฐ์ดํฐ์ ํจ๊ป ์์ ํ ํ๋ฉด์ ๋ํ๋ ํ ํธ์ถ ๋๋ ๋ฉ์๋
viewWillLayoutSubviews -๊ฒฝ๊ณ๊ฐ ํ์ ๋๋ ๋ผ์ดํ์ฌ์ดํด ์ฒซ๋จ๊ณ. ๋ทฐ ์ปจํธ๋กค๋ฌ์ ๋ทฐ์ layoutSubviews ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ง์ ์ ํธ์ถ๋จ.๋ทฐ์ bounds(์ขํ,ํฌ๊ธฐ)๊ฐ ์ต์ข ์ ์ผ๋ก ๊ฒฐ์ ๋๋ ์ต์ด์์ . (๋ณ๊ฒฝ๋ ๋, ๋ทฐ๋ ํ์๋ทฐ์ ์์น๋ฅผ ์กฐ์ ํ๋ค.) ๋ทฐ๊ฐ ํ์ ๋ทฐ์ ๋ฐฐ์น๋ฅผ ์กฐ์ ํ๊ธฐ ์ ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ์ด ๋ฉ์๋๋ฅผ overrideํ ์ ์๋ค.
- ์ปจ์คํธ๋ ์ธํธ๋ ์คํ ๋ ์ด์์์ ์ฌ์ฉํ์ง ์์๋ค๋ฉด, ์๋ธ๋ทฐ์ ๋ ์ด์์์ ์ ๋ฐ์ดํธํ๊ธฐ ์ ํฉํ ์์
- ์ฌ๋ฌ ๋ฒ ์ค๋ณต์ผ๋ก ํธ์ถ๋ ์ ์๋ค.
- ๋ฉ์ธ๋ทฐ์ ์๋ธ๋ทฐ๊ฐ ๋ก๋๋๋ ๊ฒฝ์ฐ (ํ ์ด๋ธ๋ทฐ๋ ์ปฌ๋ ์ ๋ทฐ๊ฐ ๋ก๋๋ ๊ฒฝ์ฐ? )
- ๊ธฐ๋ณธ๊ฐ nop์ผ๋ก ์๋ฌด๊ฒ๋ ํ์ง ์์
viewDidLayoutSubviews
- ๋ทฐ ์ปจํธ๋กค๋ฌ์ ํ์ ๋ทฐ๊ฐ ์ค์ ๋์์์ ์๋ฆผ
- ์๋ธ๋ทฐ๊ฐ ์ ์ ๋๊ณ ๋ ํ ํธ์ถ
- ์๋ธ๋ทฐ๊ฐ ์ ํ ๋ ํ ๋ณ๊ฒฝํ ์ ์ด ์๋ค๋ฉด ์ฌ๊ธฐ์ ์์ ํ๊ธฐ ์ ํฉํจ
- ๊ธฐ๋ณธ๊ฐ nop์ผ๋ก ์๋ฌด๊ฒ๋ ํ์ง ์์
viewWillDisappear
- ๋ค์ ViewControllerํ๋ฉด์ด ์ ํํ๊ธฐ ์ ์ด๊ฑฐ๋, viewController๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ๋ฉ์๋ viewDidDisappear
- ViewController๋ค์ด ํ๋ฉด์์ ์ฌ๋ผ์ง๊ณ ๋์ ํธ์ถ๋๋ ๋ฉ์๋
- ํ๋ฉด์ด ์ฌ๋ผ์ง๊ณ ๋์ ํ์์์ด์ง๋ (๋ฉ์ถฐ์ผํ๋) ์์ ์์ ์ด๊ณณ์์ ํจ.
viewDidUnload /viewDidDispose
- iOS6์ดํ ์ฌ์ฉํ์ง ์์. (Objective-C์์์ด ๋ถ๋ถ์ ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ ๋ฐ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํํ๋ ๊ณณ์ด์ง๋ง ์๋์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก Swift์์ ํ ํ์๊ฐ ๊ฑฐ์ ์์.)
- viewDidUnload์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ ๋ฐ์์ ๋ทฐ๊ฐ ํด์ ๋์ด ์ฌ๋ผ์ง๋ ๋ฉ์๋
- ์ ์ ๊ฐ ์ผ์ผํค๋ input์ด๋ฒคํธ ๋ค์ ์ฒ๋ฆฌ/์๋ต ํด์ฃผ๋ ๊ฒ์ ๋ด๋นํ๋ ํ๋ก์ธ์ค.
- UIApplication์ Main Run Loop ๋ฅผ View ์ ๊ด๋ จ๋ ์ด๋ฒคํธ๋ View ์ ์ ๋ฐ์ดํธ์ ํ์ฉ. Main Run Loop ๋ View์ ๊ด๋ จ๋์ด ์๊ธฐ ๋๋ฌธ์ main ์ฐ๋ ๋์์ ์คํ๋จ.
๊ทธ๋ฆผ.์ฌ์ฉ์ ์ด๋ฒคํธ(user interaction) ๋ฐ์ ๋ฐ ์ฒ๋ฆฌ๊ณผ์
- ์ ์ ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ผ์ผํด(ํฐ์น,์ค์ธ๋ฑ์ input)
- ์์คํ ์ ํตํด ์ด๋ฒคํธ๊ฐ ์์ฑ๋จ.
- UIKit ํ๋ ์์ํฌ๋ฅผ ํตํด ์์ฑ๋ port๋ก ํด๋น ์ด๋ฒคํธ๊ฐ ์ฑ์ผ๋ก ์ ๋ฌ 4.์ด๋ฒคํธ๋ ์ฑ ๋ด๋ถ์ ์ผ๋ก Queue์ ํํ๋ก ์ ๋ฆฌ๋๊ณ , Main Run Loop์ ํ๋์ฉ ๋งคํ๋จ.
- Application object(์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ฒด)๋ ์ ์ ๋ก๋ถํฐ์ input ์ด๋ฒคํธ๋ฅผ ํด์ํ๊ณ ๊ทธ์ ์์๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ Core object๋ค ์์ ์๋ ํธ๋ค๋ฌ๋ฅผ ํธ์ถ(์ฌ๊ธฐ์ ํธ๋ค๋ฌ๋ ๊ฐ๋ฐ์๊ฐ ์ ๋ ฅํ ์ฝ๋)
- ์ด๋ฌํ ๋ฉ์๋๋ค์ด ๋ฐํ๋๋ฉด ๋ค์ ์ปจํธ๋กค์ main run loop๋ก ๋์๊ฐ์ Update Cycle์ด ๋ค์ ์์๋จ
- Update Cycle์ View ๋ค์ ๋ฐฐ์นํ๊ณ ๋ค์ ๊ทธ๋ฆฌ๋ ์ญํ
๊ทธ๋ฆผ.์ ๋ฌ๋ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฑ์ run loop์์ ์ฒ๋ฆฌํ๋ ๊ณผ์
- run loop ๋๊ธฐ ์ค ์ด๋ฒคํธ ๋ฐ์(์ฃผ๋ก ์ ๋ ฅ์์ค์ ํ์ด๋จธ์์ค ์ฒ๋ฆฌ)
- ์ ํด์ง ๋ฉ์๋ ํธ์ถ(ํ์ด๋จธ์์ ์ค์ ํ ์๊ฐ๋ฐ ๋ฐ๋ผ)
- ๋ฉ์๋ ์๋ฃ ํ ๋ณ๊ฒฝ๋ ํ์๊ฐ ์๋ ์ฌํญ ์ ์ฉ(๋ทฐ์ ๊ฒฝ์ฐ setNeedsLayout, setNeedsDisplay)
- runUntil- ๋ฉ์๋์์ ์ ํ ์๊ฐ๊น์ง ์ ์ง, ํ ์ผ ์์ผ๋ฉด suspend ์ํ. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
- Update Cycle์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ก๋ถํฐ์ ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ง ์ฝ๋๋ฅผ ์ํํ๊ณ ๋ค์ main run loop๋ก ์ปจํธ๋กค์ ๋ฐํํ๋ ์ง์ ์. ๋ฐ๋ก ์ด ์ง์ ์์ ์์คํ ์ ์ฐ๋ฆฌ์ View๋ค์ ๋ฐฐ์นํ๊ณ (layout), ๋ณด์ฌ์ฃผ๊ณ (display) ์ ์ฝ(constraints)ํจ
- ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ค์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ์ด๋ค UIView์ ๋ํด ๋ณํ๋ฅผ ์ค๋ค๋ฉด, ์ด UIView๋ ๋ค์ ๊ทธ๋ ค์ ธ์ผ(redraw) ํ๋ค๊ณ ํ์๋จ.
- ์ ์ ๊ฐ ์ํธ์์ฉํ๋ ๊ฒ๊ณผ ๋ ์ด์์์ด ๋ณํ๋ ์๊ฐ์ ๊ฐญ์ ์ ์ ๊ฐ ์ธ์งํ์ง ๋ชปํ ์ ๋์ฌ์ผ ํ๋ฉฐ, iOS ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋น 60ํ๋ ์์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์, ํ ๋ฒ์ Update Cycle์ 1/60์ด ๊ฐ ๊ฑธ๋ฆผ(๋งค์ฐ ์ ์).
- Update Cycle์ ๋น ๋ฅด๊ฒ ์ ๋ฐ์ดํธ ๋๊ธฐ ๋๋ฌธ์ ์ ์ ๋ UI์ ์ํธ์์ฉ ๊ฐ์ ์ฐจ์ด๋ฅผ ๋๋ผ์ง ๋ชปํจ.
- ๊ทธ๋ฌ๋, Update Cycle์ ๋ํ ์ดํด๊ฐ ์ค์ํ ์ด์ ๋ ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ ์์ ๊ณผ ์ค์ ๋ก View๊ฐ ๋ค์ ๊ทธ๋ ค์ง๋ ์์ ์ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์, View๋ ์ฐ๋ฆฌ๊ฐ View๋ฅผ ์ ๋ฐ์ดํธ ํ๊ธฐ๋ฅผ ์ํ๋ run loop์ ํน์ ์์ ์ ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์์ ์ ์์ผ๋ฏ๋ก ์ฃผ์ ํ์.
MainRunLoop๊ฐ ํ๋ฐํด ๋ ๋, Update Cycle์ด ์ธ์ ๋ฐ์ํ๋์ง ํํํ ๊ทธ๋ฆผ
- ํ๋ฉด์์ UIView์ ํฌ๊ธฐ์ ์์น๋ฅผ ์๋ฏธ. ๋ชจ๋ View๋ frame์ ๊ฐ๊ณ ์๊ณ , ์ด๋ ๋ถ๋ชจ ๋ทฐ์ Coordinate System(์ขํ๊ณ)์์ ์ด๋์ ์์นํ๊ณ ์ผ๋ง๋ ํฌ๊ธฐ๋ฅผ ์ฐจ์งํ๋์ง๋ฅผ ๋ํ๋.
- UIView๋ ์์คํ ์๊ฒ UIView์ ๋ ์ด์์์ด ๋ณํ๋ค๊ณ ์๋ ค์ค ์ ์๋ ๋ฉ์๋๋, View์ ๋ ์ด์์์ด ๋ค์ ๊ณ์ฐ๋๋ ์์ ์ ํน์ ํ ์์ ์ ์คํํ ์ ์๊ฒ ์ค๋ฒ๋ผ์ด๋ฉํ ์ ์๋ ์ฝ๋ฐฑ ๋ฉ์๋๋ ์ ๊ณตํจ. UIView์ ํ์ ๋ฉ์๋๋ ์๋์ ๊ฐ๋ค.
layoutSubviews()
- ์๋ธ ๋ทฐ๋ค์ ์์น๋ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํจ์ ๋ฐ๋ผ View(๋ถ๋ชจ)์ ์์๋ทฐ๋ค์ ์์น์ ํฌ๊ธฐ๋ฅผ ์ฌ์กฐ์ (๋ฐฐ์น).
ํด๋น ๋ฉ์๋๋ ์ฌ๊ท์ ์ผ๋ก ๋ชจ๋ ์์ ๋ทฐ์ layoutSubviews๊น์ง ํธ์ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์คํ ์์ ๋ถํ๊ฐ ํฐ ๋ฉ์๋์. ์์คํ
์ layoutSubviews๋ฅผ ๋ทฐ์ frame์ ๋ค์ ๊ณ์ฐํด์ผ ํ ๋ ํธ์ถํ๊ธฐ ๋๋ฌธ์ layoutSubviews๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํด์ frame์ด๋ ํน์ ํ ์์น์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ง๋ง, ๋ ์ด์์์ ์
๋ฐ์ดํธํด์ผ ํ ๋ layoutSubviews๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ์ ๊ธ์ง๋์ด ์์.
layoutSubviews๊ฐ ์๋ฃ๋ ๋, viewDidLayoutSubviews๊ฐ View๋ฅผ ์์ ํ ViewController์์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์, layoutSubviews๋ View์ layout์ด ๋ณํํ๋ค๋ ์ ์ผํ ์ฝ๋ฐฑ์ผ๋ก ๋ ์ด์์์ ํฌ๊ธฐ๋ ์์น์ ์ฐ๊ด๋ ๋ก์ง์ viewDidLoad๋ viewDidAppear๊ฐ ์๋, viewDidLayoutSubviews์ ํธ์ถํด์ผ ํจ. ์ด๊ฒ์ด ์ค๋๋ ๋ ์ด์์์ด๋ ์์น ๋ณ์๋ฅผ ๋ค๋ฅธ ๊ณ์ฐ์ ์ฌ์ฉํ๋ ์ค์๋ฅผ ๋ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด ๋จ..
์ด๋ฌํ ๋ฐฉ์๋ค์ ๋ชจ๋ run loop๊ฐ ๋์๊ฐ๋ ๋์ layoutSubviews๊ฐ ์คํ๋๋ ์์ ์ด ๋ค๋ฅด๋ฉฐ, ์ง์ layoutSubviews๋ฅผ ํธ์ถํ๋ ๊ฒ๋ณด๋ค๋ ๋ถํ๊ฐ ๋ํ๋ฏ๋ก ์ฌ์ฉ๋จ
Automatic refresh triggers
๋ค์๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ค์ ์๋์ผ๋ก View๊ฐ ๊ทธ๊ฒ๋ค์ layout์ ๋ณํ๊ฐ ์๊ฒผ๋ค๊ณ ํ์๋ฅผ ํด์ฃผ์ด์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฒญํ ํ์ ์์ด, layoutSubviews๊ฐ ๋ค์ ๊ธฐํ์ ํธ์ถ์ด ๋๊ฒ ํด์ค.
- View๋ฅผ Resizing
- SubView๋ฅผ ์ถ๊ฐ
- UIScrollView๋ฅผ ์คํฌ๋กคํ ๋, UIScrollView์ ๊ทธ๊ฒ์ ๋ถ๋ชจ๋ทฐ์ layoutSubviews๊ฐ ํธ์ถ
- Device๋ฅผ ํ์ (orientation change)
- View์ Constraint๋ฅผ ๋ณ๊ฒฝ
์์ ๋ฐฉ๋ฒ๋ค์ ์๋์ผ๋ก ์์คํ ์ด View์ ์์น๊ฐ ๋ณํ๊ณ , ๋ค์ ๊ณ์ฐ๋๋๋ก ํ์ฌ ๊ฒฐ๊ตญ์ layoutSubviews๊ฐ ํธ์ถ๋๊ฒ ํด์ค. ๊ทธ๋ฌ๋ layoutSubviews๋ฅผ ์ง์ ํธ์ถํด์ค ์ ์๋ ๋ฐฉ๋ฒ๋ค๋ ์กด์ฌํจ(์๋).
setNeedsLayout()
- ๊ฐ์ฅ ์ ์ ๋ถํ๋ก ํธ์ถํ ์์๋ ๋ฉ์๋.(layoutSubview๊ฐ ํธ์ถ ๋จ)
- setNeedsLayouts์ ์์คํ ์๊ฒ ์ด View์ layout์ด ๋ค์ ๊ณ์ฐ๋์ด์ผ ํ๋ค๊ณ ์๋ ค์ค
- ๊ทธ๋ฌ๋, setNeedsLayout์ ์ฆ์ ๋ฐํ๋์ง๋ง, ์ค์ ๋ก View๋ฅผ ์ ๋ฐ์ดํธํด์ฃผ๋ ๊ฒ์ ์๋๋ฉ์๋๊ฐ ์๋ฃ๋์ด ์ฆ์ ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์กํฐ๋นํฐ์ ์ฑ์ง์ ๊ฐ์ง. (๊ทธ๋ฌ๋ ๋ ์ด์์๊ณผ ๋ค์ ๊ทธ๋ฆฌ๋ ์์ ์ด ์ค์ ๋ก ๋ฐ์ํ๊ธฐ ์ ๊น์ง๋ ์์ง ์ด๋ฅธ์ํ์ด๊ณ ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๊ฐ ์ธ์ ์ผ์ง๋ ๋ชจ๋ฅด๋ ์ํ.)
- ๋ค๋ง, ์์คํ ์ด ๋ค์ Update Cycle์์ layoutSubviews๋ฅผ View์ ์์ View๋ค์๊ฒ ํธ์ถํ๊ฒ ํ๊ณ ๊ทธ ์์ ์ setNeedsLayout์ด ํธ์ถ๋ ๋ทฐ๋ค์ Update Cycle์์ ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ก ํด์ค.
- ํธ์ถ ์ needsLayout flag๊ฐ YES๋ก ๋ณ๊ฒฝ.
- ์ฌ๋ฌ ๋ถ๋ถ์์ ํธ์ถํ๋๋ผ๋, ๋ค์ run loop์์ ํ๋ฒ๋ง ์ ์ฉ
- ๋ ์ด์์ ์ ๋ฐ์ดํธ๋ฅผ ํ๋์ ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๋ก ํตํฉํ ์ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ฑ๋ฅํฅ์์ ๋์์ด ๋จ.
layoutIfNeeded()
- ๋ง์ฝ View๊ฐ ๋ ์ด์์์ด ์ฌ์กฐ์ ๋์ด์ผ ํ๋ค๋ฉด, ์ฆ์ layoutSubviews๋ฅผ ํธ์ถํจ. ๋ ์ด์์ ์ ๋ฐ์ดํธ๊ฐ ๋ณด๋ฅ์ค์ธ ๊ฒฝ์ฐ, ํ์ View๋ฅผ ์ฆ์ ๋ ์ด์์(๋ฐฐ์น)ํฉ๋๋ค (layoutSubview๊ฐ ํธ์ถ ๋จ) ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด View๊ฐ ๋ ์ด์์์ ์ฆ์ ์ ๋ฐ์ดํธ ํ ์ ์์.
- layoutIfNeeded๋ฅผ ํธ์ถํ๋๋ฐ View๊ฐ ์ฌ์กฐ์ ๋์ด์ผ ํ๋ ์ด์ ๊ฐ ์๋ค๋ฉด, layoutSubviews๋ ํธ์ถ๋์ง ์์
- ๋์ผํ run loop์์ ๋ ์ด์์์ ์ ๋ฐ์ดํธ ์์ด layoutIfNeeded๋ฅผ ๋ ๋ฒ ํธ์ถํ๋ค๋ฉด, ๋ ๋ฒ์งธ ํธ์ถ์ layoutSubviews๋ฅผ ๋ฐ์์ํค์ง ์์
- layoutIfNeeded๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ ์ด์์์ ํ๋ ๊ฒ๊ณผ ์์ View๋ค์ ๋ค์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ์ฆ์ ์คํ๋๊ณ , ํด๋น ๋ฉ์๋๊ฐ ๋ฐํ๋๊ธฐ ์ ์ ์คํ๋จ.(์ ๋๋ฉ์ด์ ์ ์ ์ธํ๊ณ ). setNeedsLayout ๊ณผ๋ ๋ค๋ฅด๊ฒ, ์ด ๋ฉ์๋๋ ๋ค์ Update Cycle๊น์ง ๋ทฐ์ ๋ณํ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋ ์ํฉ์์ ์ ์ฉํจ.
- ์ฌ์กฐ์ ๋์ด์ผํ๋ ์ํฉ์ด ์๋๋ผ๋ฉด ๊ทธ๋ฅ setNeedsLayout์ ํธ์ถํด์ ๋ค์ Update Cycle์ ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ๋์ด run loop ํ๋ฒ ๋น View์ ๋ฐ์ดํธ๊ฐ ํ ๋ฒ๋ง ์ด๋ฃจ์ด์ง๊ฒ ํ๋ ๊ฒ์ด ์ด์์
- ํธ์ถ ์ needsLayout flag๋ฅผ ์ฒดํฌํ์ฌ YES์ธ ๊ฒฝ์ฐ ๋ทฐ ๋ณ๊ฒฝ์ ์ฆ์ ์ ์ฉ.
- ํธ์ถ ์ฆ์ ๋ทฐ ๋ณ๊ฒฝ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฑ๋ฅ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์
- ๋ฉ์๋๊ฐ ๋ฐํ๋๊ธฐ ์ ์ ์คํ(์ฆ์ ์คํ)๋๋ ๊ฒ์ผ๋ก ๋๊ธฐ์ ์ฑ์ง์ ๋ฐ. setNeedsLayout๊ณผ layoutIfNeeded์ ์ฐจ์ด์ ์ ๋๊ธฐ์ ์ผ๋ก ๋์ํ๋๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋๋์ ์ฐจ์ด.
layoutIfNeeded๋ Constraints๋ฅผ ์ ๋๋ฉ์ด์ ํ๋ ์ํฉ์์ ํนํ ์ ์ฉ
์ ๋๋ฉ์ด์ ์ด ์์ํ๊ธฐ ์ ์ layoutIfNeeded๋ฅผ ํธ์ถํ์ฌ ๋ชจ๋ ๋ ์ด์์ ์ ๋ฐ์ดํธ๊ฐ ์ ๋๋ฉ์ด์ ์ ์ ์ํ๋๋๋ก ํ ๋ค, ์๋ก์ด Constraints๋ฅผ ์ค์ ํ๊ณ , ์ ๋๋ฉ์ด์ ํด๋ก์ ์์์๋ ๋ layoutIfNeeded๋ฅผ ํธ์ถํด์ ์ ๋๋ฉ์ด์ ์ด ์ฌ๋ฐ๋ฅธ ์ํ๋ก ์งํ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด ์์.
- setNeedsLayout()์ layoutIfNeeded()์ฐจ์ด์ ๋ํ github*
์ ๋ฆฌ
- ํ์ ํด๋์ค๋ ์ด ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค์ ๋ทฐ๋ค์ ๋ณด๋ค ์ ํํ๊ฒ ๋ฐฐ์นํ๊ธฐ ์ํด ์ฌ์ ์ ํ ์ ์๋ค.
- autoresizing๊ณผ ํ์ ๋ทฐ์ ๋์์ ๋ฐ๋ฅธ constraint๊ฐ ์ํ๋ ํ๋์ ํ์ง ์์ ๊ฒฝ์ฐ์๋ง ์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํด์ผ ํ๋ค.
- ํ์ ๋ทฐ์ ํ๋ ์์ ์ค์ ํ๊ธฐ ์ํด์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ ์ ์๋ค.
- ๊ฐ์ ๋ก ๋ฐฐ์น๋ฅผ update ํ๊ธฐ ์ํด์๋ ์ด ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ์ง ๋ง๊ณ ๋ค์์ ๊ทธ๋ ค์ง ๊ฒ์ด update ํ๊ธฐ ์ด์ ์ setNeedsLayout ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋ทฐ๋ค์ ๋ ์ด์์์ ์ฆ๊ฐ์ ์ผ๋ก update ํ๊ธฐ ์ํด์ผํ๋ค๋ฉด layoutIfNeeded ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฒ.
- Layout ์ด๋ ๊ฒ์ด ๋ทฐ์ ์์น์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค๋ฉด, Display๋ ๋ทฐ์ ์์ฑ๋ค ์ค ํฌ๊ธฐ์ ์์น๋ ๋ทฐ์ ์์ View๋ค์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ์๋ ์์ฑ๋ค์ ํฌํจํจ. ์) ์, ํ ์คํธ, ์ด๋ฏธ์ง, Core Graphics ๊ทธ๋ฆฌ๊ธฐ ๋ฑ
- Display๋ Layout ๊ณผ์ ๊ณผ ์ ์ฌํจ. ์์คํ ์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๊ฐ ๋๊ฒ ํ๋ ๋ฐฉ์๊ณผ ์ฐ๋ฆฌ๊ฐ ๋ช ์์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ํด์ฃผ๊ฒ ํ๋ ๋ฐฉ์(๋ฉ์๋๋ค)์ด ์กด์ฌ.(์๋)
draw(_:)
- Apple๋ฌธ์ ์ ์ : ์ ๋ฌ๋ ์ฌ๊ฐํ ๋ด์์ receiver(์์ ์)์ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฝ๋๋ค.
- ์ฌ๊ธฐ์ ์ ๋ฌ๋ ์ฌ๊ฐํ์ด๋ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ CGRectํ์ ์ ์๋ฏธ
- UIView์ draw ๋ฉ์๋๋ Layout ์ ๋ฐ์ดํธ ๊ณผ์ ์์์ layoutSubviews์ ๊ฐ์ ์ญํ ์ ํ์ง๋ง, ํฐ ์ฐจ์ด์ ์ draw ๋ฉ์๋๋ ์์ View๋ค์ draw๊น์ง ํธ์ถํด์ฃผ์ง๋ ์๋๋ค ์ ์ด์์.
- layoutSubviews์ ๋ง์ฐฌ๊ฐ์ง๋ก draw๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ง ์์!
์ดํด๋ฅผ ์ํด zedd๋ ๋ธ๋ก๊ทธ์์ ๊ฐ์ ธ์๋ค
View๊ฐ ์ฒ์ ๋ก๋๋จ -> ๋ชจ๋ View๋ค์ด ์ค๋น๋จ(viewDidLoad. ์ฆ View๊ฐ์ฒด๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ.) -> ์ปจํ
์ธ ๋ฅผ ๊ทธ๋ ค์ค๋ ์ด๋!!!! ์ฒ์ draw๋ฉ์๋๊ฐ ๋ถ๋ฆผ -> View์
๋ฐ์ดํธ๊ฐ ๋ฐ์ํจ -> View์
๋ฐ์ดํธํด์ผํ๋ draw๋ฉ์๋๋ฅผ ํธ์ถํด๋ณผ๊น?ใ
ในใ
ใ
ใ
ใ
==> XXX!!!! ์ ๋ ์ด ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํ๋ฉด ์๋จ. View์
๋ฐ์ดํธ๊ฐ ํ์ํ๋ฉด setNeedsDisplay() ๋๋ setNeedsDisplay(_ :) ๋ฉ์๋๋ฅผ ํธ์ถํด. -> ใ
ใ
ใ
ใ
์์ฒญ๋ฐ์์ด! ๋ค์ ๋๋ก์ ์ฌ์ดํด์ ์
๋ฐ์ดํธ ํด์ค๊ฒ -> ๋ค์ ๋๋ก์ ์ฌ์ดํด๋ View๊ฐ ์
๋ฐ์ดํธ ๋จ(์ฐ๋ฆฌ๊ฐ ์ง์ draw๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์์ง๋ง, setNeedsDisplay () ๋๋ setNeedsDisplay (_ :) ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ draw๋ฉ์๋๊ฐ ๋ถ๋ฆผ.)
์ถ์ฒ: https://zeddios.tistory.com/359 [ZeddiOS]
setNeedsDisplay()
- setNeedsDisplay๋ setNeedsLayout์ ์ ์ฌ
- View์ Content๊ฐ ์ ๋ฐ์ดํธ ๋๊ฒ ํ๋ ๋ด๋ถ ํ๋๊ทธ๋ฅผ ํ์ฑํ์ํค๊ณ ์ค์ ๋ก View๊ฐ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ๋ฉ์๋๋ ๋ฐํํจ. ๊ทธ๋ฌ๋ฉด, ๋ค์ Update Cycle์ ์์คํ ์ ์ด ํ๋๊ทธ๊ฐ ํ์ฑํ๋์ด์๋ View๋ค์ draw๋ฅผ ํธ์ถํด์ ๋ค์ ๊ทธ๋ ค์ค. (๋ง์ฝ View์ ์ผ๋ถ๋ถ๋ง ๋ค์ ๊ทธ๋ ค์ง๊ธธ ์ํ๋ค๋ฉด, setNeedsDisplay ๋ฉ์๋์ ์ธ์๋ก rect๋ฅผ ์ ๋ฌํ ์ ์์)
- ๋ทฐ์ ๋ด์ฉ์ ๋ค์ ๊ทธ๋ ค์ผ ํจ์ ์์คํ ์ ์๋ฆผ.. ์ด ๋ฉ์๋๋ ์ง์ ๋ ์ฌ๊ฐํ์ ๋ทฐ์ ํ์ฌ ์๋ชป๋ ์ฌ๊ฐํ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ณ ์ฆ์ ๋ฐํํจ. ๋ทฐ๋ ๋ฌดํจํ ๋ ๋ชจ๋ ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ ๋ค์ ๋๋ก์์ฃผ๊ธฐ๊น์ง ์ค์ ๋ก ๋ค์ ๊ทธ๋ ค์ง์ง ์์.
- ํธ์ถ ์ needsDisplay flag๊ฐ YES๋ก ๋ณ๊ฒฝ.
- ํธ์ถ ์ฆ์ ๋ทฐ๊ฐ ์ ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ ๋ค์ run loop์ ๋ทฐ ๋ณ๊ฒฝ์ด ์ ์ฉ
- ์ฌ๋ฌ ๋ถ๋ถ์์ ํธ์ถํ๋๋ผ๋, ๋ค์ run loop์์ ํ๋ฒ๋ง ์ ์ฉ
- drawRect๊ฐ ํธ์ถ ๋จ
- ์ ๋ฆฌํ์๋ฉด, setNeedsDisplay()๋ฉ์๋๋ View์ ์ปจํ ์ธ ๊ฐ ๋ณํ๋ฉด ์ด View๊ฐ ๋ณํ๋ค๋ ์ฌ์ค์ ์์คํ ์ ์๋ ค์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ฆฌ๊ณ ์ด setNeedsDisplay()๋ฉ์๋๋ ์์คํ ์๊ฒ ๋ค์ ๋๋ก์ ์ฌ์ดํด๋ View์ ๋ฐ์ดํธํ๋ผ๊ณ ์ ๋ฌํจ.
Apple ๊ฐ๋ฐ์๊ฐ์ด๋์์ setNeedsDisplay์ ์
View์ ์ค์ ์ปจํ
์ธ ๊ฐ ๋ณ๊ฒฝ๋ ๋, View๋ฅผ ๋ค์ ๊ทธ๋ ค์ผํจ์ ์์คํ
์ ์๋ฆฌ๋ ๊ฒ์ ๋น์ (๊ฐ๋ฐ์)์ ์ฑ
์์
๋๋ค.
View์ setNeedsDisplay () ๋๋ setNeedsDisplay (_ :) ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ด ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ด ๋ฉ์๋๋ ๋ค์ ๋๋ก์ ์ฌ์ดํด(next drawing cycle)๋์ View๋ฅผ ์
๋ฐ์ดํธํด์ผ ํจ์ ์์คํ
์ ์๋ฆฝ๋๋ค. View๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด ๋ค์ ๋๋ก์ ์ฌ์ดํด๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ View์์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋์์ ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.
- ๋ทฐ์ UI ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ View์ dirty flag๋ฅผ ํ์ฑํ์์ผ ์ฐ๋ฆฌ๊ฐ ๋ช ์์ ์ผ๋ก setNeedsDisplay๋ฅผ ํธ์ถํ์ง ์์๋ ๋ค์ Update Cycle์ ๋ทฐ๊ฐ ๋ค์ ๊ทธ๋ ค์ง๋๋ก ์ ๋ํจ. ๊ทธ๋ฌ๋, ๋ง์ฝ UI ์ปดํฌ๋ํธ์ ์ง์ ์ ์ผ๋ก ์ฐ๊ด๋์ด ์์ง ์์ง๋ง ๋งค Update Cycle๋ง๋ค ๋ค์ ๋ทฐ๋ฅผ ๊ทธ๋ ค์ฃผ์ด์ผ ํ๋ ์์ฑ์ด ์๋ค๋ฉด ์ฐ๋ฆฐ didSet ์์ฑ ๊ฐ์์๋ฅผ ์ค์ ํ๊ณ setNeedsDisplay๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ค ์ ์๋ค.(์๋ ์ฝ๋์ฐธ๊ณ )
์์) ์ปค์คํ ์ผ๋ก View๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์๋ก ์ค๋ช
class MyView: UIView {
var numberOfPoints = 0 {
didSet {
setNeedsDisplay()
}
}
override func draw(_ rect: CGRect) {
switch numberOfPoints {
case 0:
return
case 1:
drawPoint(rect)
case 2:
drawLine(rect)
case 3:
drawTriangle(rect)
case 4:
drawRectangle(rect)
case 5:
drawPentagon(rect)
default:
drawEllipse(rect)
}
}
}
- numberOfPoints๊ฐ ๋ณํ๋ฉด draw(_:) ์์์ View๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ didSet ๋ธ๋ก ์์ setNeedsDisplay๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ค ์์์.
- Layout ๊ณผ์ ๊ณผ ๋ค๋ฅด๊ฒ Display๋ ์ฆ์ draw(_:)๋ฅผ ํธ์ถํด์ฃผ๋ ๋ฉ์๋๋ ์กด์ฌํ์ง ์์. ์ด์ ๋ ๋ทฐ๊ฐ ๋ค์ ๊ทธ๋ ค์ง๊ธฐ ์ํด ๋ค์ Update Cycle์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ.
displayIfNeeded()
- Apple๋ฌธ์ ์ ์ : ํ์์ ๋ฐ๋ผ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ ์ด์ด์ ๋ด์ฉ์ ํ์ค ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ ์ธ๋ก ๊ฐ์ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค.. ๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ํ์ํ์ง ์์ผ๋ฉฐ, ๋ ์ด์ด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ setNeedsDisplay()๋ฅผ ํธ์ถํ๊ณ , ๋ค์์ฃผ๊ธฐ ๋์ ์์คํ ์ด ๋ ์ด์ด๋ฅผ ์ ๋ฐ์ดํธ ํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
- layoutIfNeeded์ ์ ์ฌํ๊ฒ ๋๊ธฐ๋ฐฉ์์.
- NSView, NSWindow, CALayer์ ํฌํจ๋ ๋ฉ์๋
- ํธ์ถ ์ needsDisplay flag๋ฅผ ์ฒดํฌํ์ฌ YES์ธ ๊ฒฝ์ฐ ๋ทฐ ๋ณ๊ฒฝ์ ์ฆ์ ์ ์ฉ.
- ํธ์ถ ์ฆ์ ๋ทฐ ๋ณ๊ฒฝ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฑ๋ฅ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์
- drawRect๊ฐ ํธ์ถ ๋จ
-
Auto Layout์์ Layoutํ๊ณ Drawํ๋ ๊ฒ์ ๋ํด 3๋จ๊ณ์ ๊ณผ์ ์ด ์์.
-
Constraints๋ฅผ ์ ๋ฐ์ดํธํ๋ค : ์์คํ ์ด View์ ํ์ํ Constraints๋ค์ ๊ณ์ฐํ๊ณ ์ค์ ํ๋ค.
-
Layout ๋จ๊ณ : ๋ ์ด์์ ์์ง์ด View๋ค์ Frame๊ณผ ์์View๋ค์ Frame์ ๊ณ์ฐํ๊ณ ๋ฐฐ์นํ๋ค.
-
Display ๋จ๊ณ : View์ ์ปจํ ์ธ ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ณ ํ์ํ๋ค๋ฉด draw ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
updateConstraints()
- Auto Layout์ ์ด์ฉ์ View์ Constraints๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ๋ ์ฌ์ฉ.
- Layout ๋จ๊ณ์์ layoutSubviews๋ Display ๋จ๊ณ์์ draw ๊ฐ์ด, updateConstraints๋ ์ค์ง ์ค๋ฒ๋ผ์ด๋ฉ๋์ด์ผ ํ๋ฉฐ ๋ช ์์ ์ผ๋ก ํธ์ถ๋์ด์๋ ์๋จ.
- ๋ณดํต updateConstraints์์ ๋์ ์ผ๋ก ๋ณํด์ผ ํ๋ Constraints๋ค์ ๊ตฌํํ๋๋ฐ, ์ ์ ์ธ Constraints๋ค์ Interface Builder๋ View์ ์์ฑ์๋ viewDidLoad์์ ์ ์๋จ.
- Constraints๋ฅผ ํ์ฑํ/๋นํ์ฑํํ๊ฑฐ๋ Constraints์ ์ฐ์ ์์๋ constant๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ View๋ฅผ View๊ณ์ธต์์ ์ญ์ ํ๋ ๊ฒ์ updateConstraints๋ฅผ ๋ค์ Update Cycle์์ ํธ์ถํ๊ฒ ํจ.
- ๊ทธ๋ฌ๋, UpdateConstraints๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ ๋ํ ์กด์ฌํจ.(์๋)
setNeedsUpdateConstraints
- setNeedsUpdateConstraints๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋ค์ Update Cycle์์ Constraint๊ฐ ์ ๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ณด์ฅํด์ค. ์ด ๋ฉ์๋๋ setNeedsLayout์ด๋ setNeedsDisplay์ ๋น์ทํ๊ฒ ์๋ํจ.
updateConstraintsIfNeeded
- ์ด ๋ฉ์๋๋ layoutIfNeeded ์ ์ ์ฌํจ. ๊ทธ๋ฌ๋ ์ค์ง Auto Layout์ ์ฌ์ฉํ๋ ๋ทฐ์๋ง ์ ํจ.
- ์ด ๋ฉ์๋๋ Constraint Update Flag(์ด Flag๋ ์๋์ผ๋ก ์ค์ ๋๊ฑฐ๋, setNeedsUpdateConstraints๋ฅผ ํตํด ์ค์ ๋๊ฑฐ๋, invalidateIntrinsicContentSize๋ฅผ ํตํด ์ค์ ๋ ์ ์์ต๋๋ค.)๋ฅผ ๊ฒ์ฌํจ. (๋ง์ฝ Constraints๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋์ด์ผ ํ๋ฉด, updateConstraints๋ฅผ ์ฆ์ ํธ์ถ.)
invalidateIntrinsicContentSize
- Auto Layout์ ์ฌ์ฉํ๋ ๋ช๋ช View๋ค์ intrinsicContentSize ์์ฑ์ ๊ฐ๋๋ฐ, ์ด๋ View๊ฐ ๊ฐ๊ณ ์๋ Content์ ํฌ๊ธฐ์.
- intrinsicContentSize๋ ์ ํ์ ์ผ๋ก View๊ฐ ๊ฐ๊ณ ์๋ ์์๋ค์ Constraints์ผ๋ก ๊ฒฐ์ ๋์ง๋ง, ์ด๊ฒ ๋ํ ์ปค์คํ ํ ๋์์ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ ๊ณตํ ์ ์์.
- invalidateIntrinsicContentSize๋ฅผ ํธ์ถํ๋ ๊ฒ์ View๊ฐ ๊ฐ๊ณ ์๋ intrinsicContentSize๊ฐ ๋ก์์ผ๋ฉฐ, ๋ค์ Update Cycle์์ ๋ค์ ๊ณ์ฐ๋์ด์ผ ํ๋ค๊ณ ํ๋๊ทธ๋ฅผ ํ์ฑํ์์ผ์ค.
run loop์์์ ๋ชจ๋ ๊ฒ์ด ์ฐ๊ฒฐ๋๋ ค๋ฉด(layer,display,constraints)
์ ๋ฆฌ
- View์ Layout๊ณผ Display ๊ทธ๋ฆฌ๊ณ Constraints๋ run loop์์ ๋ค๋ฅธ ์์ ์ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ๋๊ณ , ๋ช ์์ ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋์ง์ ๋ํด ์ ์ฌํ ํจํด์ ๊ฐ์ง.
- ๊ฐ ์ปดํฌ๋ํธ๋ค์ layoutSubviews, draw, updateConstraints๊ณผ ๊ฐ์ ์ค์ ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ ํํ๋ ๋ฉ์๋๋ค์ ๊ฐ์ง๋ฉฐ, ๋ช ์์ ์ผ๋ก ํธ์ถ๋๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํธ์ถํ๋๋ก ์ ๋ํ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ด ์์
- ์ด๋ฌํ ๋ฉ์๋๋ค์ run loop์ ๋ง์ง๋ง์ View์ ํด๋น flag๊ฐ ํ์ฑํ๋์ด์์ผ๋ฉด ์์คํ ์ด ํธ์ถํด์ฃผ๋ ๋ฐฉ์์.
- ๋ช ๊ฐ์ง์ ์๋์ ์ผ๋ก ์ด Flag๋ค์ ํ์ฑํํด์ฃผ๋ ๋ฐฉ์๋ค์ด ์๊ณ ๋ช ์์ ์ผ๋ก ํ์ฑํ์์ผ์ฃผ๋ ๋ฐฉ์๋ ์์.
- Layout๊ณผ Constraints์ ๊ด๋ จ๋ ์ ๋ฐ์ดํธ๋ค์ ๋ํด์๋ ๋ง์ฝ ๋ค์ Update Cycle๊น์ง ๊ธฐ๋ค๋ฆด ์ ์๋ค๋ฉด, ์ฆ์ ์ ๋ฐ์ดํธ๊ฐ ๋๋๋ก ์์ฒญํ๋ ๋ฉ์๋๋ค๋ ์กด์ฌํจ.
- ์๋์ ๊ฐ์ ํ๋ ์ด๋ฌํ ๊ฐ ๋ฉ์๋๋ค์ด ์๋ํ๋ ๋ฐฉ์์.
- ์ ํ๋ฅผ ๋ณด๋ฉด Update Cycle๊ณผ Event Loop ๊ทธ๋ฆฌ๊ณ ์์์ ์ค๋ช ํ ๋ฉ์๋๋ค์ด Cycle ๋์ ์ด๋ป๊ฒ ํธ์ถ๋๋์ง ์ค๋ช ์ด ๋จ.
- ์ฐ๋ฆฌ๋ ๋ช ์์ ์ผ๋ก layoutIfNeeded๋ updateConstraintsIfNeeded๋ฅผ run loop์ ์๋ฌด ์์ ์์๋ ํธ์ถํ ์ ์๊ณ , loop์ ๋์ Update Cycle์.
- Update Cycle์ Constraints, Layout ๊ทธ๋ฆฌ๊ณ Display๋ฅผ ํด๋น ํ๋๊ทธ๊ฐ ํ์ฑํ๋์ด์๋ค๋ฉด ์ ๋ฐ์ดํธํด์ค.
- ์ด๋ฌํ ์ ๋ฐ์ดํธ๋ค์ด ์๋ฃ๋๋ฉด, run loop๋ ๋ค์ ์์ํจ..... ใ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ๋ชจ์ต์ผ๋ก
- UIView๋ ๋ด๋ถ์ ์ผ๋ก CALayer๋ฅผ ํตํด ๊ตฌํ๋จ. ๋, Core Animation๊ณผ ์ํธ์์ฉ
- ๋ ์ด์ด์ ์์น์ ํฌ๊ธฐ / ๋ ์ด์ด์ ๋ฐฐ๊ฒฝ์/ ๋ ์ด์ด์ ๊ทธ๋ ค์ง ์ปจํ ํธ (์ด๋ฏธ์ง๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ํน์ Core Graphic๋ฅผ ํตํด ๊ทธ๋ ค์ง ๊ทธ๋ํฝ ๋ฑ)/ ๋ ์ด์ด์ ๋ชจ์๋ฆฌ๊ฐ ๋๊ธ๊ฒ ๊ทธ๋ ค์ ธ์ผ ํ๋์ง/๋ ์ด์ด์ ๊ทธ๋ฆผ์๋ฅผ ์ถ๊ฐํ๊ธฐ/ ๋ ์ด์ด์ ์ธ๊ณฝ์ ์ ๊ทธ๋ ค์ฃผ๊ธฐ ๋ฑ
- CALayer๋ ์ค์ ๋ก UIView์ ์ํ๋ฉฐ UIView๋ฅผ ์ง์ํด์ฃผ๋ ์ญํ ์ ํจ
- ๊ฐ ๋ทฐ๋ง๋ค ๋ฃจํธ layer๋ ํ๋์ฉ ์กด์ฌํ๊ณ ์ด ๋ฃจํธ layer๋ ๊ฐ๊ฐ SubLayer๋ค์ ๊ฐ์ง.
- UIView๋ ๋ ์ด์์๊ณผ ํฐ์น ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฑ ๋ง์ ์์ ์ ํ์ง๋ง ์ค์ ๋ก ๋ทฐ ์์ ์ปจํ ์ธ ๋ ์ ๋๋งค์ด์ ์ ๊ทธ๋ฆฌ๋ ํ์๋ ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ์ง ์๊ณ UIKit๊ฐ Core Animation์ ์์ํจ. ์ฆ, ์ค์ง์ ์ผ๋ก ๋ทฐ ์์ ์ปจํ ์ธ ์ ์ ๋๋งค์ด์ ์ ๊ทธ๋ฆฌ๋ ํ์๋ CALayer๊ฐ ๋ด๋น
-
UIView๋ ์ฌ์ค CALayer๋ฅผ ๊ฐ์ธ๊ณ ์๋ ๊ฒ์ ๋ถ๊ณผํ๊ณ , UIView์ bounds๊ฐ ๋ณ๊ฒฝ๋๋ฉด UIView๋ ์์ ์ ๋ฃจํธ layer์ bounds๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋์ด ๋ฃจํธ layer์ ๋ ์ด์์์ ์ํด์๋ UIVIew์ ๋ง์ถ์ด ์๋์ผ๋ก ๋ณ๊ฒฝํจ. (ํ์ง๋ง SubLayer๋ค์ ์๋์ผ๋ก ๋ง์ถ์ด์ง์ง ์์..)
-
์ฝ๊ฒ ์ฐจ์ด๋ฅผ ๋ณด์๋ฉด, ClipeToBounds๋ UIView์ ์ํด์๊ณ , makeToBounds๋ CALayer์ ์ํด ์๋ ๊ฒ.
-
https://developer.apple.com/CALayer ์ ๋๋ฉ์ด์ ๊ฐ๋ฅ ์์ฑ
- https://developer.apple.com/documentation/quartzcore
- Apple๋ฌธ์ ์ ์ : ์๊ฐ์ ์์(visual elements)๋ฅผ ๋ ๋๋ง, ํฉ์ฑํ๊ณ ์ ๋๋ฉ์ด์ ํํฉ๋๋ค.
- CPU์ ๋ถ๋ด์ ์ฃผ์ง ์๊ณ ์ฑ ์๋๋ฅผ ์ ํ์ํค์ง ์์ผ๋ฉด์ ๋์ ํ๋ ์ ์๋์ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ์ ๊ณต.
- ์ ๋๋ฉ์ด์ ์ ๊ฐ ํ๋ ์์ ๊ทธ๋ฆฌ๋๋ฐ ํ์ํ ๋๋ถ๋ถ์ ์์ ์ด ์ํ.
- https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics
- ์์ ๋ฐ ์ข ๋ฃ์ง์ ๊ณผ ๊ฐ์ ๋ช๊ฐ์ง ์ ๋๋ฉ์ด์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ตฌ์ฑํ๊ณ Core Animation์ด ์์ํ๋๋ก ์ง์.
- Core Animation์ ๋๋จธ์ง ์์ ์ ์ํํ์ฌ ๋ ๋๋ง ์์ ์ ๊ฐ์ํ ํ๊ธฐ ์ํด ๋๋ถ๋ถ์ ์์ ์ ์ ์ฉ ๊ทธ๋ํฝ ํ๋์จ์ด์ ๋๊น.
- CALayer ๋ฅผ ์์ํ CATiledLayer, CAEAGLLayer ๋ฑ์ด ์๋๋ฐ, ์ํฉ์ ๋ฐ๋ผ rendering performance ๋ฅผ ๋์ผ ์ ์์.
- ore Animation Framework ๋ CALayer ์ property ๋ค์ ์ง์ modify ํ์ง ์์.
- Core Animation์ 2๊ฐ์ Layer tree๋ฅผ ๊ด๋ฆฌํ๋๋ฐ, ํ๋๋ Model layer tree, //CALayer, [CALayer modelLayer], ๋ค๋ฅธ ํ๋๋ Presentation layer tree. //Animation ์ค์๋ง ๊ด๋ฆฌ๋๋ ๋ ์, [CALayer presentationLayer]
์ ๋ฆฌ ์งฑ์ด๋ผ์ ์ฒจ๋ถ
next drawing cycle(๋๋ก์ ์ฌ์ดํด)
-
๋ค์์ ์ ๋ฆฌ..
- NSObject : ์คํฐ๋ธ์ก์ค๊ฐ ์๊ธฐ๊ฐ ๋ง๋ ํ์ฌ์์ ์ซ๊ฒจ๋จ. 80๋ ์ค๋ฐ. => ๋ ์ ํ๊ณ ์๋ก์ด ํ์ฌ ๋ง๋ฆ => ๋ฅ์คํธ OS => 10๋ ๋ง์ ๋๋ฐ ํฐํธ๋ฆผ. => ๋ฅ์คํธ ๊ธฐ์ ๋ก ๋งฅ, ์ ํ์ ๋ค์ ๋ค์ด๊ฐ.
- ์๋ฃํ, data type
- swift์์ ์ซ์๋ฅผ ์ ์ฅ
var mynumber = 10
-
mynumber๋ผ๋ ๋ณ์ ์์ฑ๊ณผ ์ซ์ 10 ํ ๋น
-
var mynumber : Int = 10
-
์์ ๊ฐ์ด ์ด๊น๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ํ์ ์ถ๋ก (type inference)์ ํ๋ฏ๋ก ๋ฐ์ดํฐ ํ์ (์๋ฃํ)์ ๋ช ์ํ ํ์ ์์
-
Bool, Character, Int, Double, String, Void๋ฑ์ด ์์
-
var x : Int
-
x= 10 // error '=' must have consistent whitespace on both sides(๊ณต๋ฐฑ์ ๋ช ํํ ์ฒ๋ฆฌํ ๊ฒ)
-
์ผ๋ฐ์ ์ผ๋ก ์ด๊น๊ฐ์ ์ฃผ์ง ์์ ๊ฒฝ์ฐ์๋ง ์๋ฃํ์ ์.
- ์ ์ ๋ฐ์ดํฐ ํ์
- ์์, ์์, 0 ๊ฐ์ ๋ด์ ์ ์๋ ๋ถํธ ์๋(sifned)์ ์
- 0, ์์๋ง ๋ด์ ์ ์๋ ๋ถํธ ์๋ (unsigned)์ ์
- 8๋นํธ,16๋นํธ,32๋นํธ,64๋นํธ ์ง์(Int8, Int16, Int32, Int64)
- ๋ถํธ์๋ ์ ์ : UInt8, UInt16, UInt32, UInt64
- ์ ํ์ ํน์ ํฌ๊ธฐ์ ๋ฐ์ดํฐ ํ์ ๋ณด๋ค Int๋ฐ์ดํฐ ํ์ ์ ๊ถ์ฅ
- 32๋นํธ ๋ถํธ ์๋ ์ ์ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ถ๋ ฅ
//\(์ถ๋ ฅํ๊ณ ์ถ์ ๋ณ์๋ ์์)
pirnt("Int32Min = \(Int32.min) Int32Max = \(Int32.max)")
Int32Min = -2147483648 Int32Max = 2147483647
- ์์์ ์ด ์๋ ์ซ์
- Doubleํ์ด ๊ธฐ๋ณธ
- Double : 64๋นํธ๋ก ๋ถ๋ ์์์ ์๋ฅผ ์ ์ฅ, ์์์ 15์๋ฆฌ ์ ํ๋
- Float : 32๋นํธ๋ก ๋ถ๋ ์์์ ์๋ฅผ ์ ์ฅ, ์์์ 6์๋ฆฌ ์ ํ๋
var myWeight : Double
var myWeight : Double = 58.5
- ์ฐธ ๋๋ ๊ฑฐ์ง์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ํ์
- Boolean ๋ฐ์ดํฐ ํ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ์ฌ ๋๊ฐ์ ๋ถ๋ฆฌ์ธ ์์ ๊ฐ(true/false)์ฌ์ฉ
var orangesAreOrange : Bool
var orangesAreOrange : true
- ๋ฌธ์, ์ซ์, ๋ฌธ์ฅ๋ถํฌ, ์ฌ๋ณผ ๊ฐ์ ์ ๋์ฝ๋(Unicode)๋ฌธ์ ํ๋๋ฅผ ์ ์ฅ
- ์ค์ํํธ์์์ ๋ฌธ์๋ค์ ๋ฌธ์์ ๋ฌถ์(Grapheme cluster)์ ํํ๋ก ์ ์ฅ
- ๋ฌธ์์ ๋ฌถ์์ ํ๋์ ๋ฌธ์๋ฅผ ํํํ๊ธฐ ์ํ์ฌ ์ ๋์ฝ๋ ์ฝ๋ ๊ฐ๋ค๋ก ์ด๋ฃจ์ด์ง
- var ๋ณ์๋ช : Character = "์ด๊น๊ฐ"
var myChar1 : Character
var myChar2 : Character = ":"
var myChar3 : Character = "X"
//Character๋ ์๋ต๋ถ๊ฐ, ์๋ตํ๋ฉด Stringํ์ด ๋จ.
- ์ ๋์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ๋ณ์์ ๋ฌธ์ X๋ฅผ ํ ๋น
- var myChar4 = "\ u{0058}"
- ๋จ์ด๋ ๋ฌธ์ฅ์ ๊ตฌ์ฑํ๋ ์ผ๋ จ์ ๋ฌธ์
- ์ ์ฅ, ๊ฒ์, ๋น๊ต, ๋ฌธ์์ด ์ฐ๊ฒฐ, ์์ ๋ฑ์ ๊ธฐ๋ฅ์ ํฌํจ
- ๋ฌธ์์ด ๋ณด๊ฐ(string interpolation)์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด๊ณผ ๋ณ์, ์์, ํํ์, ํจ์ ํธ์ถ์ ์กฐํฉ์ผ๋ก ๋ง๋ค ์๋ ์์
var userName : String = "Qussk"
var inboxCount = 29
let maxCount = 100
var message = "\(userName) has \(inboxCount) message. Message capacity remaining is \(maxCount - inboxCount)"
print(message)
- ํ์ค ๋ฌธ์ ์ธํธ๋ฟ ์๋๋ผ ๋ฌธ์์ด์ ๊ฐํ, ํญ, ๋๋ ์ ๋์ฝ๋ ๊ฐ๊ณผ ๊ฐ์ ํญ๋ชฉ์ ์ง์ ํ ์ ์๋ ์ฌ๋ฌ ํน์ ๋ฌธ์๋ ํฌํจ
- ์ด์ค์ผ์ดํ ์ํ์ค(escape sequence)
- ํน์ ๋ฌธ์๋ค์ ์ญ์ฌ๋์๋ฅผ ์ ๋์ด๋ก ํ์ฌ ๊ตฌ๋ณ
- var newline = "\n" //newline
- ์ญ์ฌ๋์๋ก ์์๋๋ ๋ชจ๋ ๋ฌธ์๋ ํน์๋ฌธ์๋ก ๊ฐ์ฃผ
- ์ญ์ฌ๋์ ๋ฌธ์์์ฒด
- var nackslach = "\ " ๋ง์ด ์ฌ์ฉํ๋ ํน์ ๋ฌธ์
\n - ๊ฐํ
\r - ์บ๋ฆฌ์ง ๋ฆฌํด(carriage return)
\t - ์ํํญ
\ \ - ์ญ์ฌ๋์
\ " = ํฐ๋ฐ์ดํ(๋ฌธ์์ด ์ ์ธ๋ถ์ ํฐ ๋ฐ์ดํ๋ฅผ ์ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋จ)
\ ' = ์์๋ฐ์ดํ(๋ฌธ์์ด ์ ์ธ๋ถ์ ์์ ๋ฐ์ดํ๋ฅผ ์ฐ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋จ)
\ u{uu} - nn์์น์ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ํํํ๋ ๋๊ฐ์ 16์ง์๊ฐ ๋ฐฐ์น๋๋ 1๋ฐ์ดํธ ์ ๋์ฝ๋ ์ค์นผ๋ผ
\ u{nnnn} - nnnn์์น์ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ํํํ๋ ๋ค ๊ฐ์ 16์ง์๊ฐ ๋ฐฐ์น๋๋ 2๋ฐ์ดํธ ์ ๋์ฝ๋ ์ค์นผ๋ผ
\ u{nnnnnn} - nnnnnn์์น์ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ํํํ๋ ๋ค ๊ฐ์ 16์ง์๊ฐ ๋ฐฐ์น๋๋ 4๋ฐ์ดํธ ์ ๋์ฝ๋ ์ค์นผ๋ผ
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์(variable)๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
- ๋ณ์์ ํ ๋น๋ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- var myVariable = 10
- var x = 0.0 , y = 0.0 , z = 0.0 (๋ค์ค ์ฌ์ฉ ๊ฐ๋ฅ)
- ์์(constant)๋ ๋ฐ์ดํฐ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๋ช ๋ช ๋ ๊ณต๊ฐ์ ์ ๊ณตํ๋ค๋ ์ ์์ ๋ณ์์ ๋น์ท
- ์ด๋ค ๊ฐ์ด ํ ๋ฒ ํ ๋น๋๋ฉด ์ดํ์ ๋ณ๊ฒฝ ๋ ์ ์์
- ์์๋ ์ฝ๋ ๋ด์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ์ ์ ์ฉ
- ์ฝ๋ ๋ด์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํน์ ๊ฐ์ ๋งค๋ฒ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค, ๊ทธ ๊ฐ์ ์์์ ํ ๋จํ ๋ค์ ์ฝ๋ ๋ด์์ ์ฐธ์กฐํ๋ฉด ์ฝ๋ ์ฝ๊ธฐ๊ฐ ๋ ์์
- let maximumNuber = 10
- ๋ณ์๋ ์์๋ช ์ ์๋ฌธ์, ์ซ์ Unicode๋ ๊ฐ๋ฅ...
- ์ ํ์ ์ฝ๋์ ํจ์จ์ฑ๊ณผ ์คํ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด var๋ณด๋ค๋ let๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ๊ถ์ฅ
- ์ค์ํํธ๋ ํ์
์์ (type safe) ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
- ๋ณ์์ ๋ฐ์ดํฐ ํ์ ์ด ์๋ณ๋๋ฉด ๊ทธ ๋ณ์๋ ๋ค๋ฅธ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์
- ๋ณ์๊ฐ ์ ์ธ๋ ํ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ์ ์ฅํ ์ ์๋ ๋์จํ ํ์ (loosely typed)์ ์ธ์ด์ ๋์กฐ์
- ์์์ ๋ณ์์ ํ์
์ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง.
- ์ฒซ๋ฒ์งธ
- ๋ณ์ ๋๋ ์์๊ฐ ์ฝ๋ ๋ด์์ ์ ์ธ๋๋ ์์ ์ ํ์ ์ด๋ ธํ ์ด์ (type annitation)์ ์ฌ์ฉํ๋ ๊ฒ
- ๋ณ์ ๋๋ ์์ ์ด๋ฆ ๋ค์์ ํ์ ์ ์ธ์ ๋๋ฉด๋จ
- Intํ์ ์ userCount๋ผ๋ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ ์ธ
- var userCount: Int = 10 // Int๊ฐ type annotation
- ๋๋ฒ์งธ
- ์ ์ธ๋ถ์ ํ์ ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์ค์ํํธ ์ปดํ์ผ๋ฌ๋ ์์ ๋๋ ๋ณ์์ ํ์ ์ ์๋ณํ๊ธฐ ์ํ์ฌ ํ์ ์ถ๋ก (typr inference)์ฌ์ฉ
- ํด๋น ์์ ๋๋ ๋ณ์์ ๊ฐ์ด ํ ๋น๋๋ ์์ ์์ ๊ทธ ๊ฐ์ ํ์ ์ ํ์ธํ๊ณ ๊ทธ์ ๊ฐ์ ํ์ ์ฒ๋ผ ์ฌ์ฉ
var signalStrenght = 2.231 // var signalStrenght : Double = 2.231
let companyName = "My Company"
//signalStrength๋ผ๋ ๋ณ์๋ฅผ Doubleํ์
(์ค์ํํธ์ ํ์
์ถ๋ก ์์ ๋ชจ๋ ๋ถ๋ ์์์ ์๋ Doubleํ์
)
//companyName์ด๋ผ๋ ์์๋ String์ผ๋ก ๊ฐ์ฃผ
- ์์๋ฅผ ์ ์ธํ ๋๋ ํ์ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋์ค์ ์ฝ๋์์ ๊ฐ์ ํ ๋นํ ์ ์๋ค. ์์ )
let bookTitle: String
var book = true
if book {
bookTitle = "iOS"
}else{
bookTitle = "Android"
}
print(bookTitle)
- ์์์๋ ๊ฐ์ ํ ๋ฒ๋ง ํ ๋นํ ์ ์๋ค.
- ์ด๋ฏธ ๊ฐ์ด ํ ๋น๋ ์์์ ๋ค์ ๊ฐ์ ํ ๋นํ๋ ค๊ณ ์๋ํ๋ค๋ฉด ๊ตฌ๋ฌธ ์๋ฌ(syntac error)๊ฐ ๋ฐ์
- ํํ์ ์ค์ํํธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ค ํ๋
- ์ฌ๋ฌ ๊ฐ์ ํ๋์ ๊ฐ์ฒด์ ์ผ์์ ์ผ๋ก ๋ฌถ๋ ๋ฐฉ๋ฒ
- ํํ์ ์ ์ฅ๋๋ ํญ๋ชฉ๋ค์ ์ด๋ ํ ํ์ ๋ ๋ ์ ์์ผ๋ฉฐ, ์ ์ฅ๋ ๊ฐ๋ค์ด ๋ชจ๋ ๋์ผํ ํ์ ์ด์ด์ผํ๋ค๋ ์ ์ฝ๋ ์์
- let myTuple = (10,12.1,"Hi")
- ํํ์ ์์๋ค์ ์ฌ๋ฌ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค์ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์
- ํน์ ํํ ๊ฐ์ ์ธ๋ฑ์ค ์์น๋ฅผ ์ฐธ์กฐํ๋ฉด ๊ฐ๋จํ๊ฒ ์ ๊ทผ
- ๋งจ ์ฒซ๋ฒ์งธ ๊ฐ์ ์ธ๋ฑ์ค0
- ์ธ๋ฑ์ค 2์์น๋ฅผ ์ถ์ถํ๊ณ ๊ทธ ๊ฐ์ ์๋ก์ด ๋ฌด์์ด ๋ณ์์ ํ ๋น
let myTuple = (10, 12.1, "Hi")
var myString = myTuple.2
print(myString) //"Hi"
- ๋จ ํ์ค์ ์ฝ๋๋ก ํํ์ ๋ชจ๋ ๊ฐ์ ์ถ์ถํ์ฌ ๋ณ์ ๋๋ ์์์ ํ ๋น
let myTuple = (10, 12.1, "Hi")
let (myInt, myFloat, myString) = myTuple
- ํํ์ ๊ฐ์ ์ ํ์ ์ผ๋ก ์ถ์ถํ๋๋ฐ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ฌด์ํ๊ณ ์ถ์ ๊ฐ์ ๋ฐ์ค(์ธ๋๋ฐ)์ ์ฌ์ฉํ๋ฉด ๊ทธ ๊ฐ์ ๋ฌด์
var (myInt, _, myString) = myTuple
- ํํ์ ์์ฑํ ๋ ๊ฐ ๊ฐ์ ์ด๋ฆ์ ํ ๋นํ ์๋ ์์
let myTuple = (count: 10, lenght: 12.1, message: "Hi")
- ํํ์ ์ ์ฅ๋ ๊ฐ์ ํ ๋น๋ ์ด๋ฆ์ ๊ฐ ๊ฐ์ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉ
- myTuple์ธ์คํด์ค์ message๊ฐ์ ์ถ๋ ฅํ๋ ์ฝ๋
print(message.message)// "Hi"
- ํํ์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ ์ ํจ์์์ ์ฌ๋ฌ ๊ฐ๋ค์ ํ ๋ฒ์ ๋ฐํํ๋ ๊ฒ
ํ ๋ณํ(as๋ก upcasting)
- ์์ ๊ด๊ณ๊ฐ ์๋ ํด๋์ค๋ค๋ผ๋ฆฌ๋ง ํ์ ์บ์คํ ๊ฐ๋ฅ
- ์์(๋ถ๋ชจ๋ก๋ถํฐ ์์๋ฐ์ ๋ ๋ง์ ๊ฒ์ ๊ฐ์ง๊ณ ์์)์ ๋ถ๋ชจ๋ก ์บ์คํ
ํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์
- as ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ํ์ ๋ณํ(Type casting)
- ์์์ธ์คํด์ค as ๋ถ๋ชจํด๋์ค // upcasting ์์ ํ ์บ์คํ , ์์์ด. ์ถ์ํ๋จ.
- ์ ์บ์คํ ์ ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ฒด๋ก ํ ๋ณํ
- ํ ๋ณํ์ ์ฑ๊ณตํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณด์ฅ๋ ๋ณํ(guaranteed conversion)
- UIButton์ UIControl์ ์์ ํด๋์ค์ด๋ฏ๋ก ์์ ํ๊ฒ ํ ๋ณํ
- let myButton : UIButton = UIButton()
- let myControl = myButton as UIControl // ์์์ธ์คํด์ค as ๋ถ๋ชจํด๋์ค
- ์์์ธ์คํด์ค์ธ myButton์ ๋ถ๋ชจ ํด๋์ค ํ์ผ๋ก ํ ๋ณํ
ํ ๋ณํ(as! as?๋ก downcasting)
- ๋ค์ด์บ์คํ ์ ์ด๋ค ํด๋์ค์์ ๋ค๋ฅธ ํด๋์ค๋ก ๋ณํํ ๋ ์์ ํ ๋ณํ์ ๋ณด์ฅํ ์ ์์
- ๋ค์ด ์บ์คํ ์์ ์ ํจํ์ง ์์ ํ ๋ณํ์ด ์ด๋ค์ก๋๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ฌ๋ฅผ ์ก์ง ์์๋ค๋ฉด, ๋ฐํ์์์ ์๋ฌ๊ฐ ๋ฐ์
- ๋ค์ด ์บ์คํ ์ ์ฃผ๋ก ์์ ํด๋์ค๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ
- ์ฑ๊ณต ํ์ ์ด ์์ผ๋ฉด as! ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ณํ(forced conversion) //๋ณํ ์๋๋ฉด crash
- ์ฑ๊ณต ํ์ ์ด ์์ผ๋ฉด as?๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ๋ฐํ // ๋ณํ์ด ์๋๋ฉด nil์ ๋ฆฌํดํ๋ฏ๋ก ์ต์ ๋ ํ์ ์ผ๋ก ๋ฐํํจ
- ๋ถ๋ชจ ์ธ์คํด์ค as! ์์ ํด๋์ค // downcasting ์ผ๋ฐ ํ์ ์ผ๋ก ๋ฐํ.ํ์ ์๋ ๊ฒฝ์ฐ
- ๋ถ๋ชจ ์ธ์คํด์ค as? ์์ ํด๋์ค //downcasting ์ต์ ๋ ํ์ ์ผ๋ก ๋ฐํ. ํ์ ์ด ์์ ๊ฒฝ์ฐ
- ํ์ ๊ฒ์ฌ (is)
- is ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ ํ์
๊ฒ์ฌ(Type check)
- ์ง์ ๋ ๊ฐ์ฒด๊ฐ MYClass๋ผ๋ ์ด๋ฆ์ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง ๊ฒ์ฌ
- ์ธ์คํด์ค๊ฐ ํด๋น ํด๋์ค์ธ๊ฐ?
- ์ธ์คํด์ค is ํด๋์ค
if mtobject is MyClass {
//myobject๋ MyClass์ ์ธ์คํด์ค์ด๋ค
}
Any
- Any can represent an instance of any type at all, including function types
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, ํจ์ํ์ ๋ ๊ฐ๋ฅ AnyObject
- AnyObject can represent an istance of any class type.
- ๋ฒ์ฉํ์
- ์์๊ด๊ณ๊ฐ ์๋๋ผ๋ ํ์ ์บ์คํ ๊ฐ๋ฅํ ํ์
- ์ด๋ค ํด๋์ค์ ๊ฐ์ฒด๋ ์ ์ฅ ๊ฐ๋ฅ
- ๊ฐ์ฅ ์ถ์ํ๋ ์ต์์ ํด๋์ค(Obj-C์ NSObject์ ๋น์ท)
- ํด๋์ค๋ง ํ์ฉํ์ฌ ๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์ ํ์ฉํ์ง ์์
- https://jusung.gitbook.io/the-swift-language-guide/language-guide
- ํ ๋น ์ฐ์ฐ์(=)๋ ๋ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๊ฐ์ง
- ์ผ์ชฝ์ ์๋ ํผ์ฐ์ฐ์๋ ๊ฐ์ด ํ ๋น๋๋ ๋ณ์ ๋๋ ์์์ด๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ์ผ์ชฝ ํผ์ฐ์ฐ์์ธ ๋ณ์๋ ์์์ ํ ๋น
var x : Int? //์ต์
๋ Int๋ณ์๋ฅผ ์ ์ธํจ
var y = 10 //์ผ๋ฐ Int๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํํจ
x = 10 //๊ฐ์ x์ ํ ๋นํจ, Optional(10)
x = x! + y //x+y์ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋นํจ, Optional(10)
x = y //y์ ๊ฐ์ x์ ํ ๋นํจ, Optional(10)
์ฐ์ ์ฐ์ฐ์
- ๋ณดํต ๋ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๋ฐ๋ ์ดํญ(binary)์ฐ์ฐ์
- ์์ธ๋ก๋ ๊ฐ์ด ์์์์ ๊ฐ๋ฆฌํค๋ ๋จํญ ๋ง์ด๋์ค ์ฐ์ฐ์(unary negative operator)์ธ '-'
- var x = 10 //๋ณ์ x์ -10์ ํ ๋นํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋จํญ - ์ฐ์ฐ์
- x = x - 5 //x์์ 5๋ฅผ ๋นผ๋ ๋บ์
์ฐ์ฐ์
- -(๋จํญ) ๋ณ์ ๋๋ ํํ์์ ๊ฐ์ ์์๋ก ๋ง๋ฆ
- * ๊ณฑ
- / ๋๋์
- + ๋ง์
- - ๋บ์
- % ๋๋จธ์ง
- ํ๋์ ํํ์ ์์ ์ฌ๋ฌ ๊ฐ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์
- x = y * 10 + x - 5 / 4
๋ณตํฉ ํ ๋น ์ฐ์ฐ์
- x = x + y
- x += y
- ๋ณ์ x๊ฐ๊ณผ ๋ณ์ y๊ฐ์ ๋ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ x์ ์ ์ฅ
๋ณตํฉ ํ ๋น ์ฐ์ฐ์ | ๊ฒฐ๊ณผ |
---|---|
x += y | x์ y๋ฅผ ๋ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋น |
x -= y | x์ y๋ฅผ ๋นผ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋น |
x *= y | x์ y๋ฅผ ๊ณฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋น |
x /= y | x์ y๋ก๋๋๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋น |
x %= y | x์ y๋ก ๋๋ ๋๋จธ์ง๋ฅผ x์ ํ ๋น |
x &= y | x์ y์ bit AND ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋น |
x |= y | x์ y์ bit OR ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ x์ ํ ๋น |
์ฆ๊ฐ ์ฐ์ฐ์์ ๊ฐ์ ์ฐ์ฐ์
- ๋จํญ ์ฐ์ฐ์
- x = x + 1 //x ๋ณ์์ ๊ฐ์ 1์ฉ ์ฆ๊ฐ
- x = x - 1 //x ๋ณ์์ ๊ฐ์ 1์ฉ ๊ฐ์
- ์์ ํํ์์ x์ ๊ฐ์ 1์ฆ๊ฐ
- ์ด๋ฌํ ๋ฐฉ๋ฒ ๋์ ++ ์ --๋ก ์ฌ์ฉํ ์ ์์์ง๋ง ํ์ฌ๋ ํ์ง(Swift3)
๋ถ๋ฆฌ์ธ ๋ ผ๋ฆฌ ์ฐ์ฐ์
- NOT (!), AND (&&), OR(||)์ XOR(^)
- NOT(!) ์ฐ์ฐ์๋ ๋ถ๋ฆฌ์ธ ๊ฐ ๋๋ ํํ์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฌ์ ๋ฐ๋๋ก ๋ฐ๊ฟ
- var flag = true //์ฐธ
- var secondFlag = !flag // secondFlag ๋ ๊ฑฐ์ง
- OR(||)์ฐ์ฐ์๋ ๋ ๊ฐ์ ํผ์ฐ์ฐ์ ์ค์ ํ๋๋ผ๋ ์ฐธ์ด๋ฉด ์ฐธ(TRUE)์ ๋ฐํํ๊ณ , ๋ ๊ฐ ๋ชจ๋ ๊ฑฐ์ง์ด๋ฉด ๊ฑฐ์ง(false)์ ๋ฐํ
if (10 < 20) || (20 < 10) {
print("Expression is true")
}
- AND(&&)์ฐ์ฐ์๋ ๋ ๊ฐ์ ํผ์ฐ์ฐ์๊ฐ ๋ชจ๋ ์ฐธ์ผ ๋๋ง ์ฐธ(TRUE)์ ๋ฐํ
if (10 < 20) && (20 < 10){
print("Expression is true")
}
๋ฒ์ ์ฐ์ฐ์ ๋ซํ ๋ฒ์ ์ฐ์ฐ์(closed range operator)
: x...y (x์์ ์์ํด์ y๋ก ๋๋๋ ๋ฒ์์ ํฌํจ๋ ์ซ์), 5...8(5,6,7,8)
๋ฐ ์ด๋ฆฐ ๋ฒ์ ์ฐ์ฐ์(helf-open range operator)
: x..< y (x๋ถํฐ ์์ํ์ฌ y๊ฐ ํฌํจ๋์ง ์๋ ์ซ์), 5..<8(5,6,7)
One-Sided Ranges
: let names = ["A","B","C","D"]
for name in names[2...]{ //[...2],[..<2]
print(name)
}//C , D
์ผํญ ์ฐ์ฐ์ ?:
- ๋น๊ต ์ฐ์ฐ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด ์ผํญ ์ฐ์ฐ์(Ternary operator)๋ฅผ ์ง์
- [์กฐ๊ฑด] ? [์ฐธ ํํ์] : [๊ฑฐ์ง ํํ์]
- ์ผํญ ์ฐ์ฐ์๋ [์กฐ๊ฑด] ๋ถ๋ถ์ ๊ณ์ฐํ์ฌ ์ฐธ(true)ํน์ ๊ฑฐ์ง(false)์ ํ์ธํ์ฌ ๊ฒฐ๊ณผ๊ฐ ์ฐธ์ด๋ฉด [์ฐธ ํํ์] ๋ถ๋ถ์ด ์คํ๋๋ฉฐ, ๊ฑฐ์ง์ด๋ฉด [๊ฑฐ์ง ํํ์] ๋ถ๋ถ์ ์ํ
var x = 10
var y = 20
print("Largest number is \(x>y ? x:y)")
// Largest number is 20
- x๊ฐ y๋ณด๋ค ํฐ ์ง ๊ฒ์ฌ์ ๊ฑฐ์ง. y๊ฐ ์ฌ์ฉ์์๊ฒ ํ์
- nil-CoalescingOperator
- ์ต์ ๋ ๋ณ์ ?? nil์ผ ๋ ํ ๋น๋๋ ๊ฐ
- ์ต์ ๋ ๋ณ์์ ๊ฐ์ด nil์ด๋ฉด ?? ๋ค์ ๊ฐ์ผ๋ก ํ ๋น๋จ
let defaultColor = "black"
var userDefinedColor : String? // defaults to nil
var myColor = userDefinedColor ?? defaultColor
//nil์ด๋ฏ๋ก defaultColor์ธ black์ผ๋ก ์ค์ ๋จ
print(myColor) //black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
//nil์ด ์๋๋ฏ๋ก ์๋ ๊ฐ์ด red๊ฐ ํ ๋น๋จ
print(myColor) // red ์ฃผ์, optional(red)๊ฐ์๋, ์๋์ผ๋ก ํ๋ฆผ.
let defaultAge = 1
var age : Int?
age = 3
print(age) //3
var myAge = age ?? defaultAge
print(myAge) //3
๋นํธAND์ฐ์ฐ์
- AND์ฐ์ฐ์๋ ๋จ์ผ ์ฐํผ์๋(&, ampersand)๋ก ํํ
- ํด๋น ์์น์ ๋นํธ๊ฐ ๋ชจ๋ 1์ผ ๊ฒฝ์ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ํด๋น ์์น๊ฐ 1
10101011 AND
00000011
===========
00000011
var x = 171
var y = 3
var z = x & y
print("Result is \(z)")
๋นํธOR์ฐ์ฐ์
- ๋ ๊ฐ์ ํผ์ฐ์ฐ์์ ๋นํธ ์ค์ ํ๋๋ง 1์ด์ด๋ ๊ฒฐ๊ณผ๊ฐ 1
- ํ๋์ ์์ง ๋ฐ(Vertical bar) ๋ฌธ์ (|)๋ก ํํ
10101011 OR
00000011
===========
10101011
var x = 171
var y = 3
var z = x | y
print("Result is \(z)")
๋นํธXOR์ฐ์ฐ์
- ๋ฐฐํ์ ๋ ผ๋ฆฌํฉ(exclusive OR)
- ์บ๋ฟ(caret)๋ฌธ์์ธ '^'๋ก ํํ
- ๋ ํผ์ฐ์ฐ์์ ๋นํธ์ค ํ ์ชฝ์ ๋นํธ๊ฐ 1์ผ ๊ฒฝ์ฐ์ 1
10101011 XOR
00000011
===========
10101000
//๊ฒฐ๊ณผ๋ 10101000์ผ๋ก, ์ญ์ง์๋ก ๋ณํํ๋ฉด 168
var x = 171
var y = 3
var z = x ^ y
print("Result is \(z)")
- ์กฐ๊ฑด-์ฆ๊ฐ(condition-increment) for๋ฌธ
- for - in ๋ฐ๋ณต๋ฌธ์ ์ปฌ๋ ์ ๋๋ ์ซ์ ๋ฒ์ ๋ด์ ์๋ ๋ชฉ๋ค์ ๋ฐ๋ณต
for ์์๋ช
in ์ปฌ๋ ์
๋๋ ๋ฒ์ {
//์คํ๋ ์ฝ๋
}
- ์์๋ช ์ ๋ฐ๋ณต๋ฌธ์ด ๋๋ฉด์ ์ปฌ๋ ์ ๋๋ ๋ฒ์์์ ๊ฐ์ ธ์จ ํญ๋ชฉ์ ๋ด๊ฒ๋ ์์ (์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ๋ชธ์ฒด์ ์๋ ์ฝ๋๋ ๋ฐ๋ณต๋ฌธ์ ํตํด ๊ฐ์ ธ์จ ํ์ฌ ํญ๋ชฉ์ ์ฐธ์กฐ์ฒด๋ก ์์๋ช ์ ์ฌ์ฉ)
- '์ปฌ๋ ์ ๋๋ ๋ฒ์'๋ ๋ฐ๋ณต๋ฌธ์ด ๋ฐ๋ณต๋๋ฉด์ ํ์ฌ์ ํญ๋ชฉ์ ์ฐธ์กฐ
//๋ฌธ์์ด ๊ฐ๋ค์ ๋ฐฐ์ด์ด๊ฑฐ๋ ๋ฒ์ ์ฐ์ฐ, ๋๋ ๋ฌธ์๋ค๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ผ ์ ์์
for index in 1...5 {
print("Value or index is \(index)")
}
- index๋ผ๋ ์ด๋ฆ์ ์์์ ํ์ฌ ํญ๋ชฉ์ด ํ ๋ฑ๋๋ฉด์ ์์
- for ๋ฐ๋ณต๋ฌธ์ด ์ซ์ 1๋ถํฐ ์์ํ์ฌ 5๋ก ๋๋๋ค๋ ๊ฒ์ผ ๊ฐ๋ฅดํค๋ ๋ซํ ๋ฒ์ ์ฐ์ฐ์๋ฅผ ์ ์ธํ๊ณ ์์
_์ฐธ์กฐ์ฒด(i)๋ก ์๋ต๊ฐ๋ฅ
for _ in 1...5 {
print("์๋
")
}
for i in 1...5 {
print("\(i) ์๋
")
}
๋ฐฐ์ด์ ํญ๋ชฉ ์ ๊ทผ
let names = ["Anna", "Alex", "Brina", "Jack"]
for name in names {
print(name)
//Anna
//Alex
//Brina
//Jack
}
๋์ ๋๋ฆฌ์ ํญ๋ชฉ ์ ๊ทผ
let numberOfLegs = ["spider": 8, "ant": 6, "cat":4]
for (animalNAme, legCount) in numberOfLehs {
print ("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs
- for ๋ฐ๋ณต๋ฌธ์ ๋ช ๋ฒ ์ ๋ ๋ฐ๋ณตํด์ผ ํ ์ง๋ฅผ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
- ์ด๋ ํ ์กฐ๊ฑด์ด ๋๊ธฐ ์ ์ ๋์ฒด ๋ช ๋ฒ ์ ๋ ๋ฐ๋ณตํด์ผ ํ ์ง๋ฅผ ์ ์ ์์ง๋ง ๊ทธ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๊น์ง๋ ๋ฐ๋ณตํด์ผํ๋ ๊ฒฝ์ฐ while๋ฐ๋ณต๋ฌธ ์ฌ์ฉ(์ฐธ์ด๋ฉด ๋ฌดํ ๋ฐ๋ณต)
- ๊ธฐ๋ณธ์ ์ผ๋ก while์ ์ง์ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๊น์ง ์์ ์ ๋ฐ๋ณต
while ์กฐ๊ฑด์ {
//์คํ์ฝ๋
}
- ์์ ์ฝ๋์์ ์กฐ๊ฑด์์ ์ฐธ,๊ฑฐ์ง์ ๋ฐํํ๋ ํ์ ์์ด๋ฉฐ, ์ฃผ์๋ถ๋ถ์ ์กฐ๊ฑด์ด ์ฐธ์ธ ๋์์ ์คํ๋ ์ฝ๋๋ฅผ ๋ํ๋
- myCount๋ณ์๊ฐ 100๋ณด๋ค ํฌ์ง ์์ ๋๊น์ง ๋ฐ๋ณต๋ ๊ฒ์ด๋ฉฐ, 100์ด ๋๋ ์์ ์์ ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋จ
var myCount = 0
while maCount < 100 {
myCount += 1
}
print(myCount) 0...100
repeat...while
- repeat...while ๋ฐ๋ณต๋ฌธ์ ๋ชธ์ฒด๋ ์ ์ด๋ ํ๋ฒ์ ์คํ
repeat {
}while ์กฐ๊ฑด์
var i = 10
repeat{
i = i - 1
print(i)
}while (i>0) // 9...0
: ๋ฐ๋ณต๋ฌธ์์ ๋น ์ ธ๋์ค๊ธฐ
- ๋ฐ๋ณต๋ฌธ์ ์์ฑํ๋ค๋ฉด ๋ฐ๋ณต๋ฌธ์ด ์๋ฃ๋๋ ์กฐ๊ฑด์ ๋ค๋ค๋ฅด๊ธฐ ์ ์ ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์ค๋ ์ด๋ค ์กฐ๊ฑด์ ๋ง๋ค ์๋ ์์. (ํนํ ๋ฌดํ๋ฃจํ๋ฅผ ์์ฑํ ๊ฒฝ์ฐ)
- ๋ฐ๋ณต๋ฌธ์์ ๋น ์ ธ๋์ค๊ธฐ ์ํด break๋ฌธ ์ฌ์ฉ
- ํ์ฌ์ ๋ฐ๋ณต๋ฌธ์์ ๋น ์ ธ๋์ ๋ฐ๋ณต๋ฌธ ๋ฐ๋ก ๋ค์์ ์๋ ์ฝ๋๋ฅผ ์คํ
- j์ ๊ฐ์ด 100์ ๋์ ๋๊น์ง ๊ณ์ ์ํํ ๊ฒ์ด๋ฉฐ, 100์ ๋์ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋๊ณ ๋ฐ๋ณต๋ฌธ ๋ฐ์ ์ฝ๋๋ฅผ ์คํ
var j = 10
for i in 1..<100 {
j += j
if j > 100 {
break
}
print ("j = \(j)")
}
//j = 20
//j = 40
//j = 80
- continue๋ ๋ฐ๋ณต๋ฌธ์์ continue๋ฌธ ์ดํ์ ๋ชจ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ณต๋ฌธ์ ์ฌ๋จ ์์ ์์น๋ก ๋์๊ฐ
- ๋ณ์ i์ ๊ฐ์ด ์ง์ ์ผ ๊ฒฝ์ฐ์๋ง printํจ์๊ฐ ํธ์ถ
- continue ๋ฌธ์ i์ ๊ฐ์ 2๋ก ๋๋ ๋๋จธ์ง๊ฐ ์์ผ๋ฉด printํธ์ถํ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋
- continue ๋ฌธ์ด ์คํ๋๋ฉด while ๋ฐ๋ณต๋ฌธ์ ์๋จ์ผ๋ก ์ด๋ํ๊ณ ๋ฐ๋ณต๋ฌธ์ ๋ค์ ์คํ
var i = 1
while 1 < 20 {
i += 1
if (1 % 2) != 0 {
contonue
}
print("i = \(i)") //2~20
}
if ๋ถ๋ฆฌ์ธ ํํ์ {
//๋ถ๋ฆฌ์ธ ํํ์์ด ์ฐธ์ผ ๊ฒฝ์ฐ ์ํ๋ ์ฝ๋
}
- ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค๊ณผ ๋ค๋ฅด๊ฒ, ์ค์ํํธ์์๋ **if๋ฌธ ๋ค์์ ์คํ์ฝ๋๊ฐ ํ ์ค์ด๋ผ๋ ๊ดํธ { }๋ฅผ ํ์์ ์ผ๋ก ์ฌ์ฉํด์ผํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก '๋ถ๋ฆฌ์ธ ํํ์'์ด ์ฐธ์ผ๋ก ํ๋จ๋๋ฉด ๊ดํธ๋ก ๊ฐ์ธ์ธ ์ฝ๋ ์คํ
- '๋ถ๋ฆฌ์ธ ํํ์'์ด ๊ฑฐ์ง์ด๋ฉด ๊ดํธ๋ก ๊ฐ์ธ์ธ ์ฝ๋๋ ๊ฑด๋๋ด๋ค
var x = 10
if x > 9 {
print("x is greater than 9!")
}
if else if ... ๋ฌธ ์ฌ์ฉํ๊ธฐ
- ๋ค์ํ ์กฐ๊ฑด์ ๋ฐํ์ผ๋ก ๊ฒฐ์ ํด์ผํ ๋ if..else..if ๊ตฌ๋ฌธ์ ์ฌ์ฉ
var x = 9
if x == 10 {
print("x is 10")
}else if x == 9 {
print("x is 9")
}else if x == 8 {
print("x is 8")
}
}
- ์ ๋นํ ๊ฐ์์ ๋น๊ต์๋ ์ ๋์ํ์ง๋ง, ๋๋ฌด ๋ง์ ์์ ๋น๊ต์๋ ๋ณต์ก
- ์ด๋ฌํ ๊ฒฝ์ฐ switch๋ฌธ์ ์( ๋ ์ ์ฐํ๊ณ ํจ๊ณผ์ ์ธ ํด๊ฒฐ์ฑ ์ ์)
: ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด๋ฉด ์คํ
- guard๋ siwft2์ ๋์
- guard๋ฌธ์ ํํ์์ด ๊ฑฐ์ง์ผ๋ก ํ๋จ ๋ ๊ฒฝ์ฐ์ ์ํ ๋ else์ ์ ๋ฐ๋์ ํฌํจํด์ผํจ
- else ์ ์ ์ํ ์ฝ๋๋ ํ์ฌ์ ์ฝ๋ ํ๋ฆ์ ๋น ์ ธ ๋๊ฐ ์ ์๋ ๊ตฌ๋ฌธ(return, break, continue, throw ๊ตฌ๋ฌธ)์ ๋ฐ๋์ ํฌํจํด์ผํจ
- ๋๋ ๋ค๋ฅธ ํจ์๋ฅผ else์ฝ๋ ๋ธ๋ก ์์์ ํธ์ถํ ์๋ ์์
guard ๋ถ๋ฆฌ์ธ ํํ์ else {
//ํํ์์ด ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ ์คํ๋ ์ฝ๋
์ฝ๋ ๋ธ๋ก์ ๋น ์ ธ๋๊ฐ ๊ตฌ๋ฌธ
}
//ํํ์์ด ์ฐธ์ผ ๊ฒฝ์ฐ์ ์คํ๋๋ ์ฝ๋๋ ์ด๊ณณ์ ์์น
- guard๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํน์ ์กฐ๊ฑด์ ๋ง์ง ์์ ๊ฒฝ์ฐ์ ํ์ฌ์ ํจ์๋ ๋ฐ๋ณต๋ฌธ์์ ๋น ์ ธ๋๊ฐ์ ์๋๋ก ํ๋ '์กฐ๊ธฐ์ถ๊ตฌ(early exit)'์ ๋ต์ ์ ๊ณต
func multiplyByTen(value : Int? ) {
guard let number = value, number < 10 else { //(์ต์
๋3)์กฐ๊ฑด์ด ๊ฑฐ์ง์ผ ๋ ์คํ
print("์๊ฐ 10 ๋ณด๋ค ํฌ๋ค")
return
}
print(number*10) //์กฐ๊ฑด์์ด ์ฐธ์ผ ๋ ์คํ, ์ฃผ์ : number๋ฅผ ์ฌ๊ธฐ์๋ ์ฌ์ฉ๊ฐ๋ฅ
}
multiplyByTen(value: 3) //30
- guard๋ฌธ์ ๊ฐ์ ์ธ๋ํ(unwrap)ํ๊ธฐ ์ํด์ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ด์ฉํ์ฌ, ๊ทธ ๊ฐ์ด 10๋ณด๋ค ์์์ง ๊ฒ์ฌ
- ๋ณ์๋ฅผ ์ธ๋ํ ํ ์ ์๊ฑฐ๋ ๊ทธ ๊ฐ์ด 10๋ณด๋ค ํฌ๋ฉด, else์ ์ด ์คํ๋์ด ์๋ฌ ๋ฉ์ธ์ง๊ฐ ์ถ๋ ฅ๋๋ฉฐ, ์ด ํจ์์์ ๋น ์ ธ ๋๊ฐ๋๋ก return ์คํ
- 10๋ณด๋ค ์์ ๊ฐ์ด๋ฉด, guard๋ฌธ ์๋์ ์๋ ์ฝ๋๊ฐ ์คํ๋์ด ๊ทธ ๊ฐ์ 10์ด ๊ณฑํด์ง ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
- ์ธ๋ํ๋ number๋ณ์๋ฅผ gurad ๋ฌธ ๋ฐ์ ์๋ ์ฝ๋๊ฐ ์ฌ์ฉํ ์ ์๋ค!! (if ๋ฌธ์ ์ด์ฉํ์ฌ ์ธ๋ํ๋ ๋ณ์๋ ๊ทธ๋ ๊ฒ ๋ชปํจ)
var index : Int?
index = 3
var treeArray = ["Oak","Pine","Yew","Birch"]
if let myValue = index { //์ต์
๋ ๋ณ์ ๊ฐ์ ์์ myValue์ ๋์
print(treeArray[myValue]) //Birch
} else {
print("index does not contain a value") // โ ์ฌ๊ธฐ์ index ๋ชป์.
}
}
- 'ํํ์'์ ๊ฐ ๋๋ ๊ฐ์ ๋ฐํํ๋ ํํ์์ ๋ํ๋ธ๋ค.
- ๊ฐ๊ฐ์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ง๋ค case ๋ฌธ์ด ํ์ํ์ฌ, ํด๋นํ๋ ์ผ์น ๊ฐ(match)์ ๋ค์์ ์ด๋ค
- ๊ฐ๊ฐ case๋ฌธ์ ํํ์์ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ์ ๋์ผํ ๋ฐ์ดํฐ ํ์ ์ด์ด์ผ ํ๋ค
- case๋ฌธ ๋น๋ฏ์๋ ํด๋น case๋ฌธ๊ณผ ์ผ์นํ์ ๋ ์คํ๋๋ ์ค์ํํธ ๊ตฌ๋ฌธ์ ์ด๋ค
- ๋ง์ง๋ง default๋ฌธ์ ํํ์๊ณผ ์ผ์นํ๋ case๋ฌธ์ด ใ ๋ฒ์ ๊ฒฝ์ฐ๋ฅผ ์ํ ๊ฒ.
var value = 4
switch (value)
{
case 0 :
print("zero") //break๋ฌธ ๋์ ๋ณด์ด์ง ์์ง๋ง ์จ์ด์์
case 1 :
print("one")
(..์ค๋ต)
default:
print("Integer out reange")
}
case๋ฌธ ๊ฒฐํฉํ๊ธฐ
- ์์ ์์ ์์ ๊ฐ๊ฐ์ case๋ฌธ์ ๊ฐ์์ ์คํํ ๊ตฌ๋ฌธ์ ๊ฐ์ก๋ค
- ๋๋๋ก ์ฌ๋ฌ ๊ฐ์ง ์๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ํด์ ๋์ผํ ์ฝ๋๋ฅผ ์คํํด์ผํ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ์ด๋ฐ๊ฒฝ์ฐ, ์คํ๋ ๊ณตํต ์ฝ๋๋ก ๊ทธ๋ฃน case๋ฌธ์ ๋ง๋ค ์ ์๋ค
- ์์ ์์ ๋ฅผ ์์ ํ์ฌ ๊ฐ์ด 0,1, ๋๋ 2์ผ ๊ฒฝ์ฐ์ ๋์ผํ ์ฝ๋๊ฐ ์คํ๋๋๋ก ํ ์ ์๋ค.
var value = 1
switch value {
case 0,1,2 : //์ด๋ฐ์์ผ๋ก
print("zero, one or two")
case 3 :
print("three")
(..์ค๋ต)
default:
print("Integer out reange")
}
switch์์์ ๋งค์นญ ๋ฒ์
- switch๋ฌธ์ ์๋ case๋ฌธ์ ๋งค์นญ ๋ฒ์๋ฅผ ๊ตฌํํ๋๋ก ํ ์๋ ์๋ค
var temperature = 83
switch temperature {
case 0..49 : // 0~49
print("cold")
case 50...79 :
print("Warm")
(..์ค๋ต)
- where๋ฌธ์ switch case์ ๋ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ ์ถ๊ฐํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ๋ ์ ์๋ค.
- ๊ฐ์ด ์ํ๋ ๋ฒ์๋ฟ๋ง ์๋๋ผ ๊ทธ ์ซ์๊ฐ ํ์์ธ์ง ์ง์์ธ์ง๋ ๊ฒ์ฌํ๋ค.
var temperature = 54
switch temperature {
case 0...49 where tempetature % 2 == 0 : //tempetature๊ฐ 2๋ก ๋๋์ด์ ์ง์๋ฉด,,
print("Cold and even")
case 50...79 where temperature % 2 == 0 :
print("Warm and even")
(..์ค๋ต)
}
- C/C++, ์ค๋ธ์ -C์ ๊ฐ์ ์ธ์ด์ ๋ฌ๋ฆฌ case๋ฌธ ๋น๋ฏ์ break๋ฌธ์ ํฌํจํ ํ์๊ฐ ์๋ค.
- ๋ค๋ฅธ์ธ์ด๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ, ์ค์ํํธ๋ ์ผ์นํ๋ case๋ฌธ์ ๋ง๋๋ฉด ์๋์ผ๋ก ๋น ์ ธ๋์จ๋ค.
- case๋ณ๋ก ๋น ์ ธ ๋๊ฐ์ง ์๊ณ ์๋๋ก ๊ณ์ ๋ด๋ ค๊ฐ๊ฒ ํ๋ ค๋ฉด fallthrough๋ฌธ์ ์ฌ์ฉํ๋ค.
var temperature = 54
switch temperature {
case 0...49 where temperature % 2 == 0 :
fallthrough //๋น ์ ธ๋๊ฐ์ง ์๊ณ ์๋๋ก ๋ด๋ ค๊ฐ
print("Cold and even")
case 50...79 where temperature % 2 == 0 :
fallthrough
print("Warm and even")
(..์ค๋ต)
default :
print("ddd")
}
- ์ค์ํํธ switch๋ฌธ์์๋ ๋ณดํต break๋ฌธ์ด ์ฌ์ฉ๋์ง ์์ง๋ง, ๋ค์๊ณผ ๊ฐ์ด default case์์ ํด์ผํ ๊ฒฝ์ฐ ์ ์ฉํ๋ค
default :
break
}
- ํน์ ์์ ์ ์ํํ๋ ์ฝ๋ ๋ธ๋ก
- ์ํํ๊ธฐ ์ํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ ๊ณต๋ ์ ์์ผ๋ฉฐ, ํจ์๋ฅผ ํธ์ถํ ์ฝ๋์ ์์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์๋ ์์
- ๋งค๊ฐ๋ณ์(perameter, ์ธ์)์ ์ธ์(argument)๋ ์ฐจ์ด๊ฐ ์์
- ํจ์ ์ ์๋ถ์ ๊ฐ์ ๋งค๊ฐ๋ณ์, ํธ์ถ์์ ๊ฐ์ ์๊ท๋จผํธ๋ผ๊ณ ํจ
๋ด ๋์ = ์ ๋ฌ์ธ์(argument)
์ํ๊ธฐ ์์ ๋ด ๋์ = ๋งค๊ฐ๋ณ์(parameter)
๋ฆฌํด ๊ฐ = return value
method
- ํน์ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ ๋ด์ ํจ์
- ํจ์๋ฅผ ์ค์ํํธ ํด๋์ค ๋ด์ ์ ์ธํ๋ฉด ๋ฉ์๋๋ผ ๋ถ๋ฆ
ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ
- func ํจ์๋ผ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ์ ์๋ ค์ค
- ํจ์๋ช - ํจ์์ด๋ฆ
- ๋งค๊ฐ๋ณ์ ์ด๋ฆ - ํจ์ ์ฝ๋ ๋ด์์ ์ฐธ์กฐ๋๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ
- ๋งค๊ฐ๋ณ์ ํ์ - ํจ์์ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์์ ํ์
- ๋ฐํ๊ฐ ํ์ - ํจ์๊ฐ ๋ฐํํ๋ ๊ฒฐ๊ณผ์ ๋ํ ๋ฐ์ดํฐ ํ์ (๋ฐํํ์ง ์์ผ๋ฉด Void -> ์๋ต๊ฐ๋ฅ )
//messageํจ์๋ ๋ฌธ์์ด๊ณผ ์ ์๋ฅผ ๋ฐ์ ๋ฌธ์์ด๋ก ๋ฐํ.
func message(name : String, age: Int) -> String {
return ("\(name), \(age)")
}
์ ์์ ํธ์ถ
func satHello(){
print("Hello")
}
sayHello() //(ํฌ๋ก์ฐ๋ฅผ ํ๋ฆฐํธํ๋) ํจ์ ํธ์ถ
C์์ Swift๋ก ํจ์ ๋ณ๊ฒฝํ๊ธฐ
int add(int x, int y) { //C, C++ //x,y๋ ํ๋ผ๋ฉํฐ
return(x+y)
}
add(10,20); //10,20์ ์ํ๋จผํธ
//ํ์
์ ์๋ฃํ์ ๋ฌด์กฐ๊ฑด ๋๋ฌธ์
func add(x: Int, y: Int) -> Int {
return(x+y)
}
add(x: 10, y:20)
๋ด๋ถ ๋งค๊ฐ๋ณ์ ์ด๋ฆ๊ณผ ์ธ๋ถ ๋งค๊ฐ๋ณ์ ์ด๋ฆ
func add(first x : Int, seconf y : Int) -> Int {
//์ธ๋ถ ๋ด๋ถ: ์๋ฃํ, ์ธ๋ถ ๋ด๋ถ: ์๋ฃํ -> ๋ฆฌํดํ
return x + y //ํจ์ ์ ์ํ ๋๋ ๋ด๋ถ ๋งค๊ฐ๋ณ์๋ช
์ ์ฌ์ฉ
//return (first+second)ํ๊ฒ ๋๋ฉด ์ค๋ฅ
}
add(first: 10, secound : 20) // add(x:10, y:20)์ ์ค๋ฅ
//ํธ์ถ์ ๋ฐ๋์ ์ธ๋ถ ๋งค๊ฐ๋ณ์๋ช
์ ์ฌ์ฉ --> ํจ์๋ฐ๊นฅ์์ ํธ์ถํ ๋ ์ฌ์ฉ
์ธ๋ถ์ด๋ฆ ์๋ต
// _์ธ๋์ค์ฝ์ด: ์ธ๋๋ฐ๋ผ๊ณ ์ฝ์ง ๋ง๋..
//์ธ๋ถ๋งค๊ฐ๋ณ์๋ช
์๋ตํ๋ค๋ ์๋ฏธ
func add(_ x: Int, _ y: Int) -> Int {
return x + y
}
print(add(10,20))
//์ฒซ๋ฒ์งธ ์ธ๋ถ๋งค๊ฐ๋ณ์๋ช
๋ง ์๋ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์,๋๋ฒ ์งธ ๋งค๊ฐ๋ณ์๋ถํฐ๋ ์ธ๋ถ๋งค๊ฐ๋ณ์ ์ฌ์ฉ(์ ์ผ ๋ง์ด ์ด๋ค๊ณ ํจ)
func add(_ x: Int, with: Int) -> Int {
return x + y
}
print(add(10, with: 20))
์ฑ์ผ๋ก ์๋ฅผ๋ค๋ฉด
@objc func changeDetePiker(_ sender : UIDatePicker) {
let datePickerView = sender
let formatter = DateFormatter()
formatter.dateDormat = "yyyy-MM-dd HH:mm:ss EEE"
lblPickerTime.text = "์ ํ์๊ฐ: " + formatter.string(from: datePickerView)
}
//๋ด๋ถ์ด๋ฆ : pickerView,row,component
//์ด๋ฐ ๋ด๋ถ์ด๋ฆ์ผ๋ก ํจ์ ์์์ ๊ฐ๋ฐํ๊ฒ ๋จ.
func pickerView(_ pickerView: UIPickerView, didSelectRow row : Int, inComponent component: Int) {
lblImageDileName.text = imageFilName[row]
imageView.image = imageArray[row]
}
: Default Parameter
- ์๊ท๋จผํธ๋ก ์ ๋ฌํ๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ, ๋ํดํธ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ฌ์ฉ
- ํจ์๋ฅผ ์ ์ธํ ๋ ๋งค๊ฐ๋ณ์์ ๋ํดํธ ๊ฐ์ ํ ๋น
- ์ด๋ฆ์ด ์ธ์๋ก ์ ๋ฌ๋์ง ์์ ๊ฒจ์ ์ ๋ํดํธ๋ก "Kim"์ด๋ผ๋ ๋ฌธ์์ด์ด ์ฌ์ฉ๋๋๋กํจ
func vuildMessage(count: Int, name: String = "Kim") -> String {
return ("\(name), you are customer number \(count)")
}
- ์ด ํจ์๋ ๊ณ ๊ฐ ์ด๋ฆ ๊ฐ์ ์ ๋ฌํ์ง ์๊ณ ๋ ํธ์ถํ ์ ์๋ค.
var message = buildMessage(count: 100)
print(message) // Kim, you are customer number 100
- ๊ณ ๊ฐ ์ด๋ฆ์ ๊ฐ์ง๊ณ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์๊ท๋จผํธ๋ฅผ ์ฐธ์กฐํจ
var message = buildeMessage(count : 50, name : "Lee")
print(message) //Lee, you are customer number 50
- ํจ์๋ ์ฌ๋ฌ ๊ฒฐ๊ณผ ๊ฐ๋ค์ ํํ๋ก ๊ฐ์ธ์ ๋ฐํํ ์ ์์
- ์ธ์น ๋จ์์ ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ผ๋, ์ผํฐ๋ฏธํฐ, ๋ฏธํฐ๋ก ๋ณํํ๊ณ ์ด ์ธ๊ฐ์ ๊ฐ์ ํ๋์ ํํ()์ ๋ฃ์ด ๋ฐํ
func sizeConverter(length: Float) -> (yards: Float, centimeters: Float, meters: Float){
let yards = length * 0.02777778
let cnetimeters = length * 2.54
let meters = length * 0.0254
retrun (yards, cnetimeters, meters)
}
var lengthTuple = sizeConverter(length:20)
print(lenthTuple.yards)
print(lenthTuple.cnetimeters)
print(lenthTuple.meters)
์ง์ ํด๋ด
func adc(leg: Float) -> (a: Float, b:Float, c:Float) {
let a = leg * 0.0277
let b = leg * 2.52222
let c = leg * 4.533
return (a,b,c)
}
var oo = adc(leg: 2)
print("a๋ \(oo.a)")
print("b๋ \(oo.b)")
print("c๋ \(oo.c)")
*2๊ฐ์ ์ ์๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ฐ๊ฐ์ ๋ฆฌํด *
fucn sss(x : Int, y : Int) -> (sum: Int, sub: Int, div: Double){
let sum = x + y
let sub = x - y
let div = Double(x)/Double(y) //x,y๋ฅผ Double๋ก ๋ฐ๊พธ๊ธฐ
//์๋ก ๋ค๋ฅธ ์๋ฃํ์ ์ฐ์ฐ์ด ์๋จ.
return (sum, sub, div)
}
var result = sss(x: 15, y: 14)
print(result.sum)
print(result.sub)
print(result.div)
swift print format์ผ๋ก ๊ตฌ๊ธ๋งํ์ฌ ์์์ ์ํ๋ ๋งํผ ์ถ๋ ฅ
: variafic parameter
- ํจ์๊ฐ ์ง์ ๋ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๊ฐ์์ ์๊ด์์ด ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ค๋ฉด ์ธ ๊ฐ์ ์ (...)์ฌ์ฉ
- ์์์ ๊ฐ์์ String ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ ์ฝ์์ ์ถ๋ ฅ
func displayStrings(strings: String...)
{
for string in strings {
print(String)
}
}
displayStrings(strins: "one", "two", "three", "four")
displayStrings(strins: "one", "two")
์์์ ๊ฐ์์ ์ ์๊ฐ์ ํฉ์ ์ถ๋ ฅํ๋ ํจ์๋ฅผ ์์ฑํ์ฌ ํธ์ถํ๊ธฐ
/*
add(numbers: 1,2,3) //6
add(numbers: 2,2,2,2,2)//10
add(numbers: 1,1,1,1,1,1,1,1,1,1)//10
๋ฅผ ์ถ๋ ฅํ๋ ํจ์ ๋ง๋ค์ด๋ณด๊ธฐ
*/
func add(numbers : Int...) -> Int {
var result = 0
for index in numbers {
result += index
}
return result
}
var number = add(numbers: 1,2,3)
print(number) //6
func add2(numbers: Int...) -> Int {
var result = 0
for index in numbers {
result += index
}
return result
}
var number2 = add2(numbers: 2,2,2,2,2)
print(number2) //10
func add3(numbers : Int...) -> Int {
var result = 0
for index in numbers {
result += index
}
return result
}
var number3 = add3(numbers: 1,1,1,1,1,1,1,1,1,1)
print(number3) //10
: call by referecn ๊ตฌํ
- swift๋ ๊ธฐ๋ณธ์ ์ผ๋ก call by valueํ์์
- swift์์ call by refernce๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- ํจ์๊ฐ ๊ฐ์ ๋ฐํํ ํ์๋ ๋งค๊ฐ๋ณ์์ ์ผ์ด๋ ๋ณํ๋ฅผ ์ ์งํ๋ ค๋ฉด, ํจ์์ ์ ์ธ๋ถ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์(inout parameter)๋ก ์ ์ธํด์ผํจ
//1.call by referenceํ๊ณ ์ถ์ ๋งค๊ฐ๋ณ์์ ์๋ฃํ ์์ inout์.
//2.call by referenceํ๊ณ ์ถ์ ๋ณ์์ &๋ถ์ฌ์ ํธ์ถ
var myValue = 10
func daoubleValue(value: inout Int) -> Int {
value += value
return(value)
}
print(myValue) //10
print(daoubleValue(value: &myValue))//20
print(myValue) //20
- swift๋ ํจ์๋ฅผ ๋ฐ์ดํฐ ํ์ ์ฒ๋ผ ์ฌ์ฉํ ์ ์์
- ๋ค์๊ณผ ๊ฐ์ด ํจ์๋ฅผ ์์ ๋๋ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ด ๊ฐ๋ฅ
func inchesToFeet(inches: Float) -> Float {
retrun inches * 0.0873636
}
let toFeet = inchesToFeet //ํจ์๋ฅผ ์๋ฃํ์ฒ๋ผ ์ฌ์ฉ
- ํจ์๋ฅผ ํธ์ถํ๋ ค๋ฉด ์๋์ ํจ์์ด๋ฆ ๋์ ์ ์์์ด๋ฆ์ ์ฌ์ฉํ์ฌ ํธ์ถ๊ฐ๋ฅ
var result = toFeet(10) //inchesToFeet(10)
- ์ด๋ค ํจ์์ ๋ค๋ฅธ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ ๋ฐํ ๊ฐ์ผ๋ก ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ (์ค์ํํธ ํจ์๋ 1๊ธ ๊ฐ์ฒด(first class object) ๋๋ 1๊ธ์๋ฏผ(first class citizen)
- ์ ํจ์๋ Floatํ ๋งค๊ฐ๋ณ์, Floatํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ํจ์์ ๋ฐ์ดํฐ ํ์ (์๋ฃํ) (Float) -> Float // (๋งค๊ฐ๋ณ์ํ)-> ๋ฆฌํดํ
- Int์ Doubleํ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ String์ ๋ฐํํ๋ ํจ์์ ๋ฐ์ดํฐ ํ์ (Int, Double) -> String
- ๋งค๊ฐ๋ณ์๋ก ํจ์๋ฅผ ๋ฐ์ผ๋ ค๋ฉด, ํจ์๋ฅผ ๋ฐ๊ฒ ๋ ํจ์๋ ํจ์์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ธํจ
func addTowInteger(x: Int, y: Int) -> Int {
return x + y
}//์ ์๋ฃํ์ ? ((Int, Int) -> Int).Type
- swift์ ํจ์๋ 1๊ธ ๊ฐ์ฒด์ด๋ค.
- ๋ค์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฐ์ฒด๋ฅผ 1๊ธ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
- ๋ณ์์ ์ ์ฅํ ์ ์๋ค.
- ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ ์ ์๋ค.
- ๋ฆฌํด๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
func inchesToFeet(inches: Float) -> Float {
return inches * 0.0873636
}
func inchesToYarde (inches: Float) -> Float {
return inches * 0.0277778
}
let toFeet = inchesToFeet
let toYard = inchesToYarde
//print(toFeet(inchesToFeet(inches: 30))) //0.22897196
//print(toYard(inchesToYarde(inches: 40))) //0.030864248
- ๋จ์๋ฅผ ๋ณํํ๊ณ ์ฝ์์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ค๋ฅธ ํจ์
//converterFunc: ๋ (Float) -> Float ์๋ฃํ๋ง ๋ค์ด๊ฐ ์ ์์(์์ toFeet, toYard๊ฐ์ ์๋ฃํ)
func outputConversion(converterFunc: (Float) -> Float, value: Float) {
let result = converterFunc(value)
print("Result = \(result)")
}
- outputConversion ํจ์๋ฅผ ํธ์ถํ ๋ ์ ์ธ๋ ๋ฐ์ดํฐ ํ์ ๊ณผ ์ผ์นํ๋ ํจ์ ์ ๋ฌ
- ๋งค๊ฐ๋ณ์๋ก ์ ์ ํ ๋ณํํจ์๋ฅผ ์ ๋ฌํ๋ฉด ์ธ์น๋ฅผ ํผํธ ๋๋ ์ผ๋๋ก ๋ณํํ๊ธฐ ์ํ์ฌ ๋์ผํ ํจ์๊ฐ ํธ์ถ๋ ์ ์์
outputConversion(converterFunc: toFeet, value: 14) //ํผํธ๋ก ๋ณํํ๋ inchesToFeetํจ์ ํธ์ถ
outputConversion(converterFunc: toYard, value: 14) //์ผ๋๋ก ๋ณํํ๋ inchesToYardํจ์ ํธ์ถ
- ๋ฐํํ์ ์ผ๋ก ํจ์์ ํ์ ์ ์ ์ธํ๋ฉด ํจ์๋ ๋ฐํ๋ ์ ์์
- ๋ค์ ํจ์๋ Boolean ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ฐ๋ผ toFeat ํจ์ ๋๋ toYardํจ์๋ฅผ ๋ฐํ
//๋งค๊ฐ๋ณ์ํ ๋ฆฌํดํ์ด ํจ์ํ : ()๊ฐ ์์ผ๋ฉด ์ผ๋จ ํจ์๊ตฌ๋! ์๊ฐํด์ผํจ : (Float) -> Float
finc decideFunction(feet: Bool) -> (Float) -> Float {
if feet {
return toFeet //ํจ์๋ฅผ ๋ฆฌํด
} else {
return toYard
}
}
- ํจ์๋ช (์ธ๋ถ๋งค๊ฐ๋ณ์ : ์ธ๋ถ๋งค๊ฐ๋ณ์: ...)
- : ์ ๊ฐ์๊ฐ ๋งค๊ฐ๋ณ์์ ๊ฐ์
func add(x: Int, y: Int) -> Int {
return x + y
}
//add( : : )
func add(first x: Int, second: Int) -> Int {
return x + y
}
//add(first: second: )
- numberOfRows(inSection:)
func numberOfRows(inSection section: Int) -> Int
- tableView(_ : cellForRowAt: )
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
- tableView(_ numberOfRowsInSection: )
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
- C,C++,Objc-C์ block
- Java์ Lambda function
- C#์ Delegates
- ํด๋ก์ ํํ์์ ๋ ๋ฆฝ์ ์ธ ์ฝ๋ ๋ธ๋ก
- ํด๋ก์ : ์ต๋ช ํจ์(์ด๋ฆ์ด ์๋ ํจ์)
//๊ธฐ์กดํจ์
func add(x: Int, y: Int) -> Int {
return x + y
}
print(add(x:10, y:20))
//ํด๋ก์ ์ด์ฉ
let add = {(x: Int, y: Int) -> Int in
retrun x + y
}
print(add(x:10, y:20))
//๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ก ์ฌ์ฉ
- ํด๋ก์ ํํ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๊ฑฐ๋, ๊ฐ์ ๋ฐํํ๋๋ก ๋ง๋ค ์๋ ์์
{(<๋งค๊ฐ๋ณ์ ์ด๋ฆ> : <๋งค๊ฐ๋ณ์ ํ์
>, ... ) -> <๋ฐํํ์
> in
//ํด๋ก์ ํํ์ ์ฝ๋
}
- ํด๋ก์ ํํ์์ ์ ์ธํ๊ณ ์์์ ํ ๋นํ ๋ค์, ํจ์๋ฅผ ํธ์ถ
let sayHello = { print("Hello") }
sayHello() //์์์ฒ๋ผ ํจ์ ํธ์ถ
- ๋๊ฐ์ ์ ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ ์ ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํ
let multiply = {(val1: Int, val2: Int) -> Int in
return val1 * val2
}//์ฌ๊ธฐ์ multiply์ ์๋ฃํ์ (Int, Int) -> Int
let result = multiply(10,20) //์์๋ฅผ ํจ์์ฒ๋ผ ํธ์ถ, 200
: trailing closure (๊ผฌ๋ฆฌ ํด๋ก์ )
- ํด๋ก์ ๊ฐ ํจ์์ ๋ง์ง๋ง ์๊ท๋จผํธ๋ผ๋ฉด ๋ง์ง๋ง ๋งค๊ฐ๋ณ์ ์ด๋ฆ(์ฌ๊ธฐ์๋ handler: )์ ์๋ตํ ํ ํจ์ ์๊ดํธ ์ธ๋ถ์ ํด๋ก์ ๋ฅผ ๊ตฌํ
let onAction = UIAlertAction(title: "์๋์ค, ์ผญ๋๋ค(on).",
style: UIAlertAtion.style.default) { Action in //->handler ๋ ๋ ค๋ฒ๋ฆผ. //๋ง์ง๋ง ์ธ์์ ๊ฒฝ์ฐ์ ์๋ต๊ฐ๋ฅ
self.lampImag.image = self.imagOn
self.isLampOn = true
}
let removeAction = UIAlertAction(title: "๋ค, ์ ๊ฑฐํฉ๋๋ค.",
style: UIAlertAtion.style.destructive, handler : { Action in
self.isLampOn = false
}
- ios๊ฐ๋ฐ์ ์ ์์ด๋์ด ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- https://github.com/devxoul/Then
- Swift Package Manager ์ด์ฉ.
UIView
/*
๋ณดํต์ ์
private let backImage : UIImageView = {
let i = UIImageView()
i.contentMode = .scaleAspectFill
return i
}()
private let backImage : UIImageView = {
$0.contentMode = .scaleAspectFill
return $0
์ ํํ๋ฅผ then์ผ๋ก ์ฒ๋ฆฌ -> ํด๋ก์ ธํ
*/
private let backgroundImageView = UIImageView(frame: .screenBounds).then {
$0.image = UIImage(named: "sunny")
$0.contentMode = .scaleAspectFill
}
private let blurView = UIVisualEffectView(frame: .screenBounds).then {
$0.effect = UIBlurEffect(style: .dark)
}
private let topInfoView = UIView()
private let locationLabel = UILabel().then {
$0.textColor = .white
$0.textAlignment = .center
$0.font = .systemFont(ofSize: 18, weight: .black)
}
private let timeLabel = UILabel().then {
$0.textColor = .white
$0.textAlignment = .center
$0.font = .systemFont(ofSize: 12, weight: .black)
}
let reloadButton = UIButton(type: .system).then {
$0.setTitle("โป", for: .normal)
$0.setTitleColor(.white, for: .normal)
$0.titleLabel?.font = .preferredFont(forTextStyle: .title1)
$0.alpha = 0
}
let tableView = UITableView().then {
$0.rowHeight = Layout.currentWeatherCellHeight
$0.tableFooterView = UIView()
$0.backgroundColor = .clear
$0.separatorColor = .white
$0.allowsSelection = false
$0.showsVerticalScrollIndicator = false
}
- $0์ผ๋ก view์ ๋ํ ๋ด์ฉ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌ
Foundation
- then์ ํ๋กตํ ์ฝ์ธใ .
import Foundation
protocol Then {}
extension NSObject: Then {}
extension Then where Self: AnyObject {
func then(_ configure: (Self) -> Void) -> Self {
configure(self) //์
ํ๋ฅผ ๋ฐ์์ --> ์
ํ ์์จ? $0์์ ์๋ ค์ค์ฌํ๊ธฐ ๋๋ฌธ์
return self //์
ํ๋ฅผ ๋ฆฌํด
//ํ์
: Self -> void๋ฅผ ๋ฑ๋ ํจ์ํ์
.
}
}
then์ ํ๋กํ ์ฝ์
extension์ผ๋ก NSObject์ ์ฑํ,
//ํ๋กํ ์ฝ ์ฑํํ๋ฉด์๋, AnyObject์ธ ๊ฒฝ์ฐ. AnyObject์ ํด๋์คํ์
์. ํด๋์ค ํ์
์ผ ๋ ์ด ์์
์ ํด๋ผ.
extension Then where Self: AnyObject {
- ์์๋ backgroundImageView๋ก ๋ฆ.
- then์ ์ฌ์ฉ์, configure์ self๋ฅผ ๋ฃ๊ณ , self๋ฅผ ๋ฐํํ๋ค๋ ๋ป.
- ํด๋ก์ ์ ๋ด์ฉ์ configure -> then ์ดํ์ $0.์ด์ฉ๊ตฌ ๋ถ๋ถ.
์๋
- configure(self) ๋ถ๋ถ์ $0์ด ๋ฌด์์ธ์ง ์๋ ค์ฃผ์ด์ผํจ.
- self์ type์ imageView()
- return ์ imageView๋ฅผ ๋ฐํํ๊ฒ ๋จ.
ํ๋กํผํฐ
- ์ ์ฅ ํ๋กํผํฐ : ์ธ์คํด์ค์ ๋ณ์๋ ์์
- ์ฐ์ฐ ํ๋กํผํฐ : ํน์ ์ฐ์ฐ์ ์ํํ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง
- ํ์ ํ๋กํผํฐ : ์ธ์คํด์ค๊ฐ ์๋ ํ์ ์์ฒด์ ์ํ ํ๋กํผํฐ
- ํ๋กํผํฐ ๊ฐ์์ : ํ๋กํผํฐ๊ฐ์ด ๋ณ๊ฒฝ์ด๋๋ฉด ํธ์ถ๋๋ ๋ฉ์์ง(willSet, didSet)
๋ฉ์๋
- ์ธ์คํด์ค ๋ฉ์๋ : ํน์ ํ์ ์ ์ธ์คํด์ค์ ์ํ ๋ฉ์๋(์ผ๋ฐ์ ์ธ)
- ํ์ (ํด๋์ค) ๋ฉ์๋ : ํ์ ์์ฒด์์ ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฉ์๋
์ ๊ทผ์ ์ด
- ์ฝ๋๋ผ๋ฆฌ ์ํธ์์ฉํ ๋ ํ์ผ ๊ฐ ๋๋ ๋ชจ๋๊ฐ์ ์ ๊ทผ์ ์ ํ ํ ์ ์๋ ๊ธฐ๋ฅ. ์ ๊ทผ์ ์ด๋ฅผ ๊ตฌํ์ ์จ๊ธฐ๊ณ ํ์ฉ๋ ๊ธฐ๋ฅ๋ง ๋ ธ์ถํ ์ ์์.
์ ๊ทผ์์ค | ํค์๋ | ์ ๊ทผ๋ | ๋ฒ์ | ๋น๊ณ |
---|---|---|---|---|
๊ฐ๋ฐฉ์ ๊ทผ | open | ๋์ | ๋ชจ๋ ์ธ๋ถ๊น์ง | ํด๋์ค์์๋ง ์ฌ์ฉ |
๊ณต๊ฐ์ ๊ทผ | public | ๋ชจ๋ ์ธ๋ถ๊น์ง | ||
๋ด๋ถ์ ๊ทผ | Internal | ๋ชจ๋ ๋ด๋ถ | ||
๊ฐ๋ฐฉ์ ๊ทผ | fileprivate | ๋ชจ๋ ๋ด๋ถ | ||
๋น๊ณต๊ฐ์ ๊ทผ | private | ๋ฎ์ | ๊ธฐ๋ฅ ์ ์ ๋ด๋ถ |
- ์ฒญ์ฌ์ง์ด๋ ์ค๊ณ์ฌ์ ๊ทธ๋ฆผ์ด ๊ฑด๋ฌผ์ด ์์ฑ๋ ํ์ ๋ชจ์ต์ ๋ํ๋ด๊ณ ์๋ ๊ฒ์ฒ๋ผ ํด๋์ค(class)๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋์์ ๋ ์ด๋ ํ ๋ชจ์ต์ด ๋ณด์ผ ๊ฒ์ธ์ง ์ ์
- ๋ฉ์๋๋ ์ด๋ ํ ์ผ์ ํ๊ณ ์ด๋ ํ ์์ฑ์ด ์๋์ง ๋ฑ์ ์ ์
- ๋ถ์ด๋นต์ ๋ง๋๋ ๋ฐ ๋ถ์ด๋นต์ ๋ง๋๋ ํ.
- ํด๋์ค๋ก๋ถํฐ ๋ง๋ค์ด์ง ๊ฐ์ฒด(๋ถ์ด๋นต๋ค) ==> ์ธ์คํด์ค
- When an object is created by a constructor of the class, the resulting object is called an instance of the class. ํด๋์ค๋ก๋ถํฐ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ์ธ์คํด์ค๋ผ ํ๋ค.
- ํด๋์ค : Dog { var ๊ฐ์ฒด ==> ์ธ์คํด์ค : ๋ฉ๋ฉ์ด, ํดํผ, ๋ฉ๋ฆฌ
Swift
- ์๋์ฐจ๋ผ๋ Class์ ๋ฌธ,ํธ๋ค,๋ฐํด,์์ ํน์ ๋ฉค๋ฒ๋ณ์(Mamber VarLable)๋ ํ๋กํผํฐ(Property), ์์ง์ธ๋ค,์ ์ฐจํ๋ค, ๊ฐ์ํ๋ค๋ ํ์์ ๋ฉค๋ฒํจ์(Member Function)์ ๋ฉ์๋(Method)
- ์บก์ํํ ๋, ๋ช ์ฌ๋ ํ๋กํผํฐ, ๋์ฌ๋ ๋ฉ์๋๋ก ์งํ๋จ. ํ๋กํผํฐ์ ๋ฉ์๋๊ฐ์ง๊ณ ๋ ผ๋ค. ํ๋กํผํฐ๋ ๋ฐ์ดํฐ, ์ฒ๋ฆฌํ๋ ๋์์ ๋ฉ์๋
์ธ์คํด์ค(instance)
- ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ๊ฐ์ฒด(object)
- In object-oriented programming(OOP), an instanc is a concrete(์ค์ฒด๊ฐ ์๋) occyrrence of any object, existing usually durinhg the runtime of a computer program. Formally, "instance" is synontmous with "object" as they are each a particular value (realization), and these may be called an instance object. "instance" emghasize the distinct identity(๋ถ๋ช ํ ์ ์ฒด์ฑ) of the object .
- ์ํํธ์จ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋, ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ฌ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ชจ๋
- ๊ฐ์ฒด์ ๊ตฌ์ฑ
- ๋ฐ์ดํฐ ๋ณ์(data variable) or ์์ฑ(property)
- ํจ์ or ๋ฉ์๋(method)
- C#๊ณผ ๋น์ท
class ์๋ก์ด ํด๋์ค ์ด๋ฆ : ๋ถ๋ชจํด๋์ค {
//ํ๋กํผํฐ
//์ธ์คํด์ค ๋ฉ์๋ (์ผ๋ฐ์ ์ธ ๋ฉ์๋)
//ํ์
, ๋ฉ์๋(ํด๋์ค ๋ฉ์๋)
}
- "ํ๋กํผํฐ" ๋ถ๋ถ์ ํด๋์ค ๋ด์ ํฌํจ๋๋ ๋ณ์(var)์ ์์(let)๋ฅผ ์ ์ํ๋ค
- "์ธ์คํด์ค ๋ฉ์๋"๋ ๊ฐ์ฒด๊ฐ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค
- "ํ์ ๋ฉ์๋"๋ ํด๋์ค๊ฐ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
- ํ๋กํผํฐ๋ ์ด๊ธฐ๊ฐ์ด ์๊ฑฐ๋ Init์ ์ด์ฉํด์ ์ด๊ธฐํํ๊ฑฐ๋ ์ต์ ๋ ๋ณ์(์์)๋ก ์ ์ธ
- ํ๋กํผํฐ๋ ์ ์ฅ ํ๋กํผํฐ(stored property)์ ๊ณ์ฐ ํ๋กํผํฐ(calculated property)๊ฐ ์๋ค.
- age, weight๋ stored property
- ํ๋กํผํฐ๋ ์ด๊ธฐ๊ฐ์ด ์๊ฑฐ๋ ์ต์ ๋ ๋ณ์(์์)๋ก ์ ์ธ
class Man {
var age : Int = 20
var weight : Double = 3.3
}
class Man {
var age : Int?
var weight : Double!
}
- ์ธ์คํด์ค(instance) ๋ฉ์๋, ํด๋์ค ๋๋ ํ์ (class or type)๋ฉ์๋
- ์ธ์คํด์ค ๋ฉ์๋๋ ์ธ์คํด์ค์์ ๋์
- Man์ผ๋ก๋ถํฐ ๋ง๋ค์ด์ง ์ธ์คํด์ค๊ฐ display()๋ฅผ ๊ฐ์ง๊ณ ๋ ธ๋ ๊ฒ์.
class Man {
var age : Int = 20
var weight : Double = 3.3
func display() {
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
}
var kim : Man = Man()
kim.display()
print(kim.age)
์ธ์คํด์ค ์์ฑ๊ณผ ๋ฉ์๋์ ํ๋กํผํฐ ์ ๊ทผ
var x : Int
var kim : Man (erro, variable 'kim' used before being initalized)
var age : Int = 0
var ๋ณ์๋ช
: ์๋ฃํ = ์ด๊ธฐ๊ฐ
var ์ธ์คํด์ค๋ช
: ํด๋์ค๋ช
= ํด๋์ค๋ช
()
var ์ธ์คํด์ค๋ช
= ํด๋์ค๋ช
() //๊ดํธ๋ ๋์ ๋ณด์ด์ง ์๋ default initializer์ ๋ํ๋
var kim : Man = Man()
var kim = Man()
์ธ์คํด์ค.ํ๋กํผํฐ // kim.age
์ธ์คํด์ค.์ธ์คํด์ค๋ฉ์๋ // kim.display
: ํด๋์ค ๋ฉ์๋ or ํ์ ๋ฉ์๋๋ผ๊ณ ๋ ๋ถ๋ฆ
- ํด๋์ค.ํด๋์ค๋ฉ์๋
- ํ์ ๋ฉ์๋ ๋๋ ํด๋์ค ๋ฉ์๋๋ ํด๋์ค ๋ ๋ฒจ์์ ๋์ํ๋ ๊ฒ์ผ๋ก, ํด๋์ค์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์
- ํ์ ๋ฉ์๋๋ ์ธ์คํด์ค ๋ฉ์๋์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ธํ์ง๋ง class๋ staticํค์๋๋ฅผ ์์ ๋ถ์ฌ์ ์ ์ธ
- classํค์๋๋ก ๋ง๋ ํด๋์ค ๋ฉ์๋๋ ์์ ํด๋์ค์์ override๊ฐ๋ฅํจ
class Man {
var age : Int = 20
var weight : Double = 3.3
func display() {
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
calss func cM(){ //override๊ฐ๋ฅ
print("cM์ ํด๋์ค ๋ฉ์๋์
๋๋ค.")
}
static func scM(){
print("scM์ ํด๋์ค ๋ฉ์๋(static)")
}
}
var kim : Man = Man()
kim.display() //kim์ cM,scM์ ๊ฐ์ง๊ณ ๋ ์ ์๋ค.
Man.cM() //ํด๋์ค์ ์คํํฑ์ ํด๋์ค ์์ฒด๊ฐ ๊ฐ์ง๊ณ ๋.
Man.scM() //ํด๋์ค์ ์คํํฑ์ ํด๋์ค ์์ฒด๊ฐ ๊ฐ์ง๊ณ ๋.
: init()
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ(enum) ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์์ ์์ ํด์ผํ ์ด๊ธฐํ ์์
- ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด์ ์๋ ํธ์ถ๋จ
- init ๋ฉ์๋(์์ฑ์)
init(){
}
- desiganted initaializer (๋ฐ์ง๊ทธ๋ค์ดํธ ์ด๋์ ๋ผ์ด์ ) : ๋ชจ๋ ํ๋กํผํฐ(age, weight)๋ฅผ ๋ค ์ด๊ธฐํ ์ํค๋ ์์ฑ์
- ์๋ฉธ์
- ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง ๋ ์๋ ํธ์ถ
- deinit { } //์๊ดํธ ์์
class Man {
var age : Int = 20
var weight : Double = 3.3
func display() {
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
init(yourAge: Int, yourWeight: Double){
age = yourAge
weight = yourWeight
} //desiganted initaializer
//var kim : Man = Man() //error
var kim : Man = Man(yourAge: 10, yourWeight: 5.6) //๋ํดํธ๋ก ์๊น -> ๊ผญ ๋ง๋ค์ด์ง ํ์๋๋ก ํธ์ถํด์ผํจ.
kim.display()
- ์ด๊ธฐ๊ฐ์ด ๊ณ ์ ์ด๋ผ๋ฉด ์์ var ํ๋กํผํฐ์์ ํด์ฃผ๋ ๊ฒ ์ข์. ํ์ง๋ง, ๊ฐ์ด ๋งค๋ฒ ๋ฐ๋์ด์ผํ๊ณ ๋ค๋ฅธ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์ถ์ ์ํฉ์ด๋ผ๋ฉด Init์ผ๋ก ๋ฐ์.
- ํ์ฌ ํด๋์ค ๋ด ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ฆฌํฌ ๋ ๋ฉ์๋๋ ํ๋กํผํฐ ์์ self.์ ๋ถ์
- ์๋ ์์ค์์๋ self๋ฅผ ๋ถ์ฌ๋ ๋์ด ์๋ตํด๋ ๋จ
class Man {
var age : Int = 20
var weight : Double = 3.3
init(yourAge: Int, yourWeight: Double){
age = yourAge //self.age = yourAge (ํ์ฌ ํด๋์ค ๋ด์ age์ ๊ฐ๋ฅดํค๋ฏ๋ก ์๋ต๊ฐ๋ฅ)
weight = yourWeight
}
- ์๋ ์์ค์์๋ ๋งค๊ฐ๋ณ์์ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ฐ๋์ ์จ์ผํจ
class Man {
var age : Int = 20
var weight : Double = 3.3
init(age : Int, weight: Double){
self.age = age // ๋งค๊ฐ๋ณ์์ age์ ํ๋กํผํฐ์ age๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด self๋ถ์. (์๋ก๋ฅผ ๋ช
์ํ๊ธฐ ์ํด)
self.weight = weight
}
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
: calculated property๋ ํ๋กํผํฐ๊ฐ ์ค์ ๋๊ฑฐ๋๊ฒ์ ๋๋ ์์ ์์ ๊ณ์ฐ ๋๋ ํ์๋ ๊ฐ
- ๊ณ์ฐ ํ๋กํผํฐ๋ ๊ฒํฐ(getter)๋ฉ์๋์ ๊ณ์ฐ์ ์ํํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ํฌํจํ๋ ์ธํฐ(setter)๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ๊ตฌํ
- manAge๋ ๊ณ์ฐ ํ๋กํผํฐ๋ก ์ ์ฅํ๋กํผํฐ age์ ๊ฐ์์ 1์ ๋บธ ๊ฐ์ผ๋ก ํ๊ฒ ๋ค.
class Man {
var age : Int = 20
var weight : Double = 3.3
var manAge : Int { //๋ฉ์๋ ๊ฐ์ง๋ง ์ ์ฅํ๋กํผํฐ์ {}์ด์ด์ ์์
get {
return age - 1
}
}
func display(){
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
init(age: Int, weight: Double){
slef.age = age
slef.weight = weight
}
}
var kim : Man = Man(age: 10, weight : 20.5)
kim.display()
print(kim.manAge) //9
- getter : setter๊ฐ ์์ผ๋ฉด get { }์ ์๋ตํ ์ ์์ผ๋ฉฐ ๋ณ๊ฒฝํ์ง ์๋๋ผ๋ var๋ก ์ ์ธํด์ผํจ.
var manAge : Int { //๋ฉ์๋ ๊ฐ์ง๋ง ์ ์ฅํ๋กํผํฐ์ {}์ด์ด์ ์์
return age - 1
}
//๊ทธ๋์ ์ด๋ ๊ฒ get์ ์์จ ์ ์๋ค,, get์ด ์จ์ด์๋ ํํ์ธ ๊ฒ์.
class Man {
var age : Int = 20
var weight : Double = 3.3
var manAge : Int { //๋ฉ์๋ ๊ฐ์ง๋ง ์ ์ฅํ๋กํผํฐ์ {}์ด์ด์ ์์
get {
return age - 1
}
set (USAAge) {
age = USAAge + 1
}
}
func display(){
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
init(age: Int, weight: Double){
slef.age = age
slef.weight = weight
}
}
var kim : Man = Man(age: 10, weight : 20.5)
kim.display()
print(kim.manAge) //19, getํธ์ถ
print(kim.age) // 20
kim.manAge = 3 // manAge์ 3 ๋์
. ==> setter ํธ์ถ
print(kim.age) // 4 ==> set๊ฐ ๋์ํ๋ฏ๋ก 4๊ฐ๋จ +1
- setter : setter๊ฐ ์์ผ๋ฉด get { }์ ์๋ตํ ์ ์์.
- ๋งค๊ฐ๋ณ์ ๋ช ์ nuwValue๊ฐ ๊ธฐ๋ณธ
set (newValue) {
age = newValue + 1
}
- Shorthand Setter Declaration
- setter์ ๋งค๊ฐ๋ณ์๋ช ์ด newValue์ธ ๊ฒฝ์ฐ์๋ง ์ด๋ ๊ฒ "(newValue)"์๋ต ๊ฐ๋ฅ.
set {
age = newValue + 1
}
- getter์ setter๋ฅผ ๊ฐ๋ ๊ณ์ฐ ํ๋กํผํฐ manAge
class Man {
var age : Int = 20
var weight : Double = 3.3
var manAge : Int { //๋ฉ์๋ ๊ฐ์ง๋ง ์ ์ฅํ๋กํผํฐ์ {}์ด์ด์ ์์
get { return age - 1 }
set { age = newValue + 1 }
}
func display(){
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
init(age: Int, weight: Double){
slef.age = age
slef.weight = weight
}
}
var kim : Man = Man(age: 10, weight : 20.5)
kim.display()
print(kim.manAge) //19, getํธ์ถ
print(kim.age) // 20
kim.manAge = 3 // manAge์ 3 ๋์
. ==> setter ํธ์ถ
print(kim.age) // 4 ==> set๊ฐ ๋์ํ๋ฏ๋ก 4๊ฐ๋จ +1
: method overloading ์์ฑ์ ์ค์ฒฉ
- ๋งค๊ฐ๋ณ์์ ๊ฐ์์ ์๋ฃํ์ด ๋ค๋ฅธ ๊ฐ์ ์ด๋ฆ์ ํจ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์
- ๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅธ ๋ ์์ฑ์๋ฅผ ํ ์ป ๋๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์
- ํ๋์ ํด๋์ค๋ ๊ฐ์ ์ด๋ฆ์ ํจ์๊ฐ ์ฌ ์ ์๋ ๊ฒ์ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ ์ค๋ฒ๋ก๋ฉ์ด๋ผ๊ณ ํจ!
class Man {
var age : Int = 1
var weight : Double = 3.3
func display(){
print ("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ=\(weight))
}
init(age: Int, weight: Double){ //1 ๋์ด,๋ชธ๋ฌด๊ฒ ๋์ ์ด๊ธฐํ
slef.age = age
slef.weight = weight
}
init(age : Int){ //2 ๋์ด๋ง ์ด๊ธฐํ
self.age = age
}
}
var kim : Man = Man(age: 10, weight: 20.5) //1
var kim2 : Man = Man(age: 10) //2
kim.display()
kim2.display()
์ฑ์ผ๋ก ์๋ฅผ ๋ค๋ฉด
- ์ฑ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ณ ๋๋ฆฌํ๋ ํด๋์ค UIImage๋ 15๊ฐ์ Init()๊ฐ overloading๋์ด ์์
- let myImage : UIImage = UIImage(named: "apple.png")!
- var aNewUIImage = UIImage(CGImage: imageRef)
- Loaing and Caching Images //ํ๋ฒ ์บ์๋ฅผ ํ๋ฉด ๋น ๋ฅด๊ฒ ํ ์ ์๋ ์ธ์ ๋ฉ์๋
- init?(named: String, in: Bundle?, compatibleWith: UITraitCollection?)
- init?(named: Strinf)
- init(imageLiteralResurecName: String)
- Creating and Initializing Image Objects //๋งค๋ฒ ์ด๋์ ๋ผ์ด์ ํ๋ ์ธ์ ๋ฉ์๋
- init?(contentsOffile: String)
- init?(data: Data)
- init?(data: Data, scale : CGFloat)
- init(cgImage: CGImage)
- init(cgImage: CGImage, scale: CGFloat, orientation: UIImage.Orientation)
- init(ciImage: CIImage, scale: CGFloat, orientation: UIImage.Orientation)
... ์ด๋ฐ์
initํ์ ?ํ๊ฐ ์๋ ์ฐจ์ด ๋ฌด์?
Failable Initializers(์คํจ๊ฐ๋ฅํ ์์ฑ์ : init?)
- let myImage: UIImage = UIImage(named: "apple.png")!
- apple.pngํ์ผ์ด ์ ใ ์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ด nil ๋ฐํ
- nil ๊ฐ๋ ์ ์ฅํ ์ ์์ผ๋ ค๋ฉด inite๋ค์์ "?"์ ํ๋ฉฐ ์ต์ ๋ ๊ฐ์ด ๋ฆฌํด๋จ
- init?(named name : String) // Failable initializers //์ต์ ๋๋ก ๋ฆฌํด์ด๋ฉ๋๋ค.
- init?๋ก ๋ง๋ ์ธ์คํด์ค๋ ์ต์ ๋ํ์ผ๋ก ๋ง๋ค์ด์ ธ์, ์ฌ์ฉํ๋ ค๋ฉด ์ต์ ๋์ ์ธ๋ํํด์ผํด์ ์์ ์์ ์์ ์ ์ผ ๋ง์ง๋ง์ "!" ๊ฐ ์์
- superclass(๋ถ๋ชจ class)์ <=== subclass(์์ class) : class๋ค์ด์ด๊ทธ๋จ
- ์์, ํด๋์ค, ํ์ ํด๋์ค
- ์์๋ฐ์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์์๋ฐ์ผ๋ฉฐ, ์์ ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐ
- ์์๋ฐ์ ํด๋์ค๋ค์ ํ์ ํด๋์(subclass)๋๋ ์์ ํด๋์ค(child class)
- ํ์ ํด๋์ค๊ฐ ์์๋ฐ์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค(parent class) ๋๋ ์์ ํด๋์ (superclass)
- ๋จ์ผ ์์(single inheritence) : ์ค์ํํธ์์ ํ์ ํด๋์คํ ๋จ ํ๋์ ๋ถ๋ชจ ํด๋์ค๋ง ์์๋ฐ์ ์ ์์
์ค์ํํธ์ ์์
class ์์ : ๋ถ๋ชจ {
}
- C#์์์ ๋์ผ, C++์์๋ 3๊ฐ์ง๋ฐฉ๋ฒ (ํผ๋ธ๋ฆญ,ํ๋ผ์ด๋ฒ,ํ๋กํํฐ๋), ์๋ฐ๋ ์ต์คํ ์ฆ
- ๋ถ๋ชจ ํด๋์ค๋ ํ๋๋ง ๊ฐ๋ฅํ๋ฉฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๋๋จธ์ง๋ ํ๋กํ ์ฝ
- class ํด๋์ค๋ช : ๋ถ๋ชจ๋ช , ํ๋กํ ์ฝ๋ช { } // ๋ถ๋ชจ ๋ค์์ ํ๊ธฐ
- class ํด๋์ค๋ช : ํ๋กํ ์ฝ๋ช { } //๋ถ๋ชจ๊ฐ ์์ผ๋ฉด ํ๋กํ ์ฝ ๋ช ๋ง ๊ธฐ์ฌ
- class ํด๋์ค๋ช : ํ๋กํ ์ฝ๋ช 1, ํ๋กํ ์ฝ๋ช 2 {}
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, extension์ ํ๋กํ ์ฝ์ ์ฑํ(adopt)ํ ์ ์์ //ํ๋กํ ์ฝ์ ์์์ด์๋๋ผ ์ฑํ์ ๊ฐ๋ ์
//๋ถ๋ชจ
class Man {
var age : Int : 1
var weight : Double = 3.5
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
}
}
//์์ - ๋ถ๋ชจ๊ฐ ๊ฐ์ง ๊ฒ์ ๋ฌผ๋ ค๋ฐ์์!!
class Student : Man {
//๋น์ด์์ง๋ง Man์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ง๊ณ ์์
}
var kim : Man = Man(age:10, weight: 20.5)
kim.display() //age: 10
var lee : Strudent = Student(age: 20 ,weight: 65.2) //Strudent๋ฅผ ํ์
์ผ๋ก ํด๋ Man์ ํ๋กํผํฐ๋ฅผ ์ธ ์ ์์
lee.display()
print(lee.age) //age: 20
: ๋ถ๋ชจ ๋ฉ์๋ ํธ์ถ ์ ์ฌ์ฉ
//๋ถ๋ชจ
class Man {
var age : Int : 1
var weight : Double = 3.5
func displayS(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
}
}
//์์ - ๋ถ๋ชจ๊ฐ ๊ฐ์ง ๊ฒ์ ๋ฌผ๋ ค๋ฐ์์!!
class Student : Man {
var name : String = "Qussk"
func display2(){
print("์ด๋ฆ = \(name), ๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(name: String, age: Int, weight: Double){
super.init(age:age, weight: weight) //๋ถ๋ชจ๋ฉ์๋ ํธ์ถ -> ๊ผญ ๋ถ๋ชจ๊ฒ์ super.init์ผ๋ก ํธ์ถํด์ผํจ.
self.name = name
}
}
var lee : Strudent = Student(name: "์์ ค๋ผ", age: 20 ,weight: 65.2) //Strudent๋ฅผ ํ์
์ผ๋ก ํด๋ Man์ ํ๋กํผํฐ๋ฅผ ์ธ ์ ์์
lee.display2() //์์ ค๋ผ, 20, 66.2
lee.display() //๋ถ๋ชจ์ ์๋ ํจ์ ๊ฐ์ ธ์ด. // 1, 3.5 //***๋์ด๋ ๋ชธ๋ฌด๊ฒ๋ง ๊ฐ์ ธ์ด.
//๋ณด์ถฉ
init(name: String, age2: Int, weigh2t: Double){
super.init(age:age2, weight: weight2) //๋ถ๋ชจ๋ฉ์๋ ํธ์ถ -> ๊ผญ ๋ถ๋ชจ๊ฒ์ super.init์ผ๋ก ํธ์ถํด์ผํจ.
self.name = name
}
var lee : Student = Student(age2: 20, weight2: 65.2, name: "ํ๊ธธ๋")
: ๋ถ๋ชจ์ ์์์ ๊ฐ์ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ์์ ์ฐ์
- overoading๊ณผ override์ ์ฐจ์ด์ ์์๋ณด๊ธฐ
- overoading์ ํจ์์ด๋ฆ์ด ๊ฐ์ init๋ฉ์๋ ์ฌ๋ฌ๊ฐ ์ค์ฒฉํ์ฌ ์ฌ์ฉ.
- override์ ๋ถ๋ชจ์ ์์๊ฐ์ ๊ด๊ณ์์ ๋๊ฐ์ ์ด๋ฆ์ ๋ฉ์๋๊ฐ ์์ ๋, ์์์ชฝ์ ๋ฉ์๋๋ฅผ ์ฐ์ ์ ์ผ๋ก ํธ์ถํ๋ค.
- ์ฌ์ ์ ์๋ฏธ :๋ฌด์๋ณด๋ค๋. //๋ถ๋ชจ๊ฒ ๋ฌด์ํ๊ณ ์์๊ฑฐ ๋จผ์ ํด์ค๊ฒ~~
- ๋ถ๋ชจ์ ์์์ display()๋ผ๋ ๋ฉ์๋๊ฐ ์์ด์ Studentํด๋์ค๋ display()๋ฉ์๋๊ฐ ๋ ๊ฐ์
- Studentํด๋์ค์ ์ธ์คํด์ค lee๊ฐ display()๋ฅผ ํธ์ถํ ๋, ์์ ํด๋์ค๊ฐ ์๋ก ๋ง๋ display() ๋ฉ์๋๊ฐ ์ฐ์ ์ ์ผ๋ก ํธ์ถ๋๋ ค๋ฉด func ์์ overrideํค์๋ ์
//๋ถ๋ชจ
class Man {
var age : Int : 1
var weight : Double = 3.5
func displayS(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
}
}
//์์
class Student : Man {
var name : String = "Qussk"
override func display() { //์์์ด ๋ง๋ ์๋ก์ด display()๋ฅผ ๋จผ์ ํธ์ถํด์ฃผ์ธ์.
print("์ด๋ฆ = \(name), ๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double, name: String){
super.init(age:age, weight: weight)
self.name = name
}
}
var lee : Strudent = Student(age: 20 ,weight: 65.2, name: "ํ๊ธธ๋")
lee.display() //20, 65.2, "ํ๊ธธ๋"
: ํ์ฅ
- ์ค์ํํธ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, protocol์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐ
- ์๋ ์์ค์ฝ๋(์๊ธ ๋ชจ๋ธ๋ง(retroactive modeling))์ ์ ๊ทผํ์ง ๋ชปํ๋ ํ์ ์ ํ์ฅํ๋ ๋ฅ๋ ฅ๋ ํฌํจ. (ํ์ฅ์ Objective-C์์์ ์นดํ ๊ณ ๋ฆฌ์ ๋น์ท.
- Objective-C ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅด๊ฒ, Swift์ ํ์ฅ์ ์ด๋ฆ์ ๊ฐ์ง์ง ์์
- ์ต์คํ ์ ์ ํ์ ํด๋์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ์ฐธ์กฐ(์์)ํ์ง ์๊ณ ๊ธฐ์กด ํด๋์ค์ ๋ฉ์๋, ์์ฑ์, ๊ณ์ฐํ๋กํผํฐ ๋ฑ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํ์ฌ ์ฌ์ฉ
- ์ค์ํํธ ์ธ์ด์ built-inํด๋์ค์ iOS ํ๋ ์์ํฌ์ ๋ด์ฅ๋ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋, ์ต์คํ ์ ์ ์ด์ฉํ๋ฉด ๋งค์ฐ ํจ๊ณผ์ ์
- ํด๋์ค(๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ, protocol)๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ํ์ฅ(์ต์คํ ์ )๋๋ค.
extension ๊ธฐ์กดํ์
์ด๋ฆ {
//์๋ก์ด ๊ธฐ๋ฅ
}
- ํ์ค ์๋ฃํ Double ๊ตฌ์กฐ์ฒด์ ๋ ๋ฐฐ์ ๊ฐ์ ๋ฐํํ๋ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ
- Doubleํ์ ์ธ์คํด์ค myValue๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
extension Double {
var squared : Double {
return self * self
}
}
let isValue : Double = 3.0
print(isValue.squared) //0.22897196
print(3.0.squared) //Doubleํ ๊ฐ์๋ .์ผ๋ก ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
//0.030864248
extension ๊ธฐ๋ฅ
- ๊ณ์ฐ ์ธ์คํด์ค ํ๋กํผํฐ์ ๊ณ์ฐ ํ์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐ
- ์ธ์คํด์ค ๋ฉ์๋์ ํ์ ๋ฉ์๋๋ฅผ ์ ์
- ์๋ก์ด ์ด๊ธฐํ ์ ๊ณต
- ์๋ธ์คํฌ๋ฆฝํธ ์ ์
- ์๋ก ์ค์ฒฉ๋ ํ์ ์ ์ ์ํ๊ณ ์ฌ์ฉ
- ๊ธฐ์กด ํ์ ์ ํ๋กํ ์ฝ์ ์ค์ํ๋๋ก ๋ง๋ค๊ธฐ
์ ๋ค๋ฆญ์ด ์๋ ๊ฒฝ์ฐ
extension Stack where Element: Equatable {
func isTop(_ item: Element) -> Bool {
guard let topItem = items.last else {
return false
}
return topItem == item
}
}
: access control
access modigier(or access apeciifiers)
- ์ ๊ทผ ์์ฑ(์ ๊ทผ ์์ ์, ์ก์ธ์ค ์์ ์, ์ก์ธ์ค ์ง์ ์)๋ ํด๋์ค, ๋ฉ์๋, ๋ฉค๋ฒ์ ์ ๊ทผ ๊ฐ๋ฅ์ฑ์ ์ค์ ํ๋ ๊ฐ์ฒด์งํฅ ์ธ์ด์ ํค์๋
- ๊ตฌ์ฑ ์์๋ฅผ ์บก์ํํ๋ ๋ฐ ์ฌ์ฉ
- *์ ์ธ์ด๋ณ ๋ํดํธ ์ ๊ทผ ์์ฑ(๊ธฐ๋ณธ ์์ฑ) - ์๋ตํ๊ฒ ๋๋ฉด ํ๋ผ์ด๋ฒ ๋จ.
keyword | C# | C++ | Java |
---|---|---|---|
private | class | *calss, and/or, friend classes | class |
private protected | deived classes in the ame assembly | - | - |
protexted internal | same assemnly, and/or, derived classes | - | - |
protected | derived classes | deived(์์) classes, and/or, feiend classes | with its package |
package | - | - | *within its package |
internal | *same assembly | - | - |
public | everybody | everybody | everybody |
private : ๊ธฐ๋ณธ protected : ์์๋ฐ์ ์์๊น์ง ํ์ฉ public : ๋๊ตฌ์๊ฒ๋ ๋ค ํ์ฉ
Swift์ access control
https://jusung.gitbook.io/the-swift-language-guide/language-guide/25-access-control https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html
public class MyClass {
fileprivate var name : String = "Kim"
private func play(){}
func display(){}
}
- ์ ๊ทผ์ ์ด๋ฅผ ์๋ตํ๋ฉด Internald์ด ๊ธฐ๋ณธ
- ๋ชจ๋์ ํ๋์ ์ฑ, framework(UIKit), ์ธ๋ถ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ฝ๊ฒ ๋งํด์ import ๋๋ ๊ฒ๋ค์ด ๋ชจ๋.
- open class var blue : UIColor { get }
- open : ๋ชจ๋ ์ธ๋ถ๊น์ง(ํด๋์ค์๋ง ์ฌ์ฉ) ์ ๊ทผ ๊ฐ๋ฅ
- class : ํด๋์ค ํ๋กํผํฐ, ์คํ ํฑ ํ๋กํผํฐ
- ์ฝ๊ธฐ ์ฐ๊ธฐ ๊ฐ๋ฅํ ํ๋กํผํฐ๋ ์ ์ ๋ค์ { get set }
- ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ ํ๋กํผํฐ๋ ์ ์ ๋ค์ { get }
- ํน์ ์ญํ ์ ํ๊ธฐ ์ํ ๋ฉ์๋. ํ๋กํผํฐ, ๊ธฐํ ์๊ตฌ์ฌํญ ๋ฑ์ ์ฒญ์ฌ์ง.
- ๊ตฌ์กฐ์ฒด, ํด๋์ค, ์ด๊ฑฐํ์ ํ๋กํ ์ฝ์ ์ฑํํด์ ํน์ ๊ธฐ๋ฅ์ ์คํํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ์ค์ ๋ก ๊ตฌํํ ์ ์์.
- ํ๋กํ ์ฝ์ ์ ์๋ฅผ ํ๊ณ ์ ์๋ฅผ ํ ๋ฟ ์ค์ค๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ์ง ์์.
- ํ๋์ ํ์ ์ผ๋ก์จ ์ฌ์ฉ๋๋ฉฐ, ํ์ ์ด ํ์ฉ๋๋ ๋ชจ๋ ๊ณณ์ ์ฌ์ฉํ ์ ์์.
- ํจ์, ๋ฉ์๋, ์ด๋์
๋ผ์ด์ ์ ํ๋ผ๋ฏธํฐ ํ์
ํน์ ๋ฆฌํด ํ์
- ์์, ๋ณ์, ํ๋กํผํฐ์ ํ์
- ๋ฐฐ์ด, ๋์
๋๋ฆฌ์ ์์ํ์
๊ธฐ๋ณธ
protocol ํ๋กํ ์ฝ์ด๋ฆ {
// ํ๋กํ ์ฝ ์ ์
}
์ง์ ์ฌ์ฉํด ๋ดค๋ ๊ฒ
//1. ๊ธฐ๋ฅ์ถ๊ฐ
extension ViewController: StartViewControllerDelegate {
func handleDismiss() {
let MainVC = MainViewController()
MainVC.modalPresentationStyle = .fullScreen
self.present(MainVC, animated: false)
}
}
//2. ํ์ํ ๊ณณ์ ์ ์
protocol StartViewControllerDelegate: class {
func handleDismiss()
}
//2-1. ๋ณ์์ ๋ด์์ ์ฌ์ฉํ๊ธฐ
weak var delegate: StartViewControllerDelegate?
//3. ๋ฒํผ์ ์ฌ์ฉ
@objc func setupButton(_ sender: UIButton){
dismiss(animated: false, completion: {
self.delegate?.handleDismiss()
})
protocol์
-
ํน์ ํด๋์ค์ ๊ด๋ จ์๋ ํ๋กํผํฐ, ๋ฉ์๋ ์ ์ธ ์งํฉ
- ํจ์(๋ฉ์๋) ์ ์๋ ์์
- ๊ธฐ๋ฅ์ด๋ ์์ฑ์ ๋ํ ์ค๊ณ๋
- ํด๋์ค(๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ)์์ ์ฑํ(adopt)ํ์ฌ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํจ.
-
์๋ฐ, C#์ intetface, C++์ abstrack base calss
-
Protocol Oriented Programming(POP)
- ํ๋กํ ์ฝ ๋จ์๋ก ๋ฌถ์ด ํํํ๊ณ , extension์ผ๋ก ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ๊ตฌํ(protocol default implementation)์ ํด์ ๋จ์ผ ์์์ ํ๊ณ๋ฅผ ๊ทน๋ณต
์ค์ํํธ ์์๊ณผ ํ๋กํ ์ฝ ์ฑํ
- ๋ถ๋ชจํด๋์ค๋ ํ๋๋ง ๊ฐ๋ฅํ๋ฉฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ๋๋จธ์ง๋ ํ๋กํ ์ฝ
- class ํด๋์ค๋ช
: ๋ถ๋ชจ๋ช
, ํ๋กํ ์ฝ๋ช
{ }
- ๋ถ๋ชจ๊ฐ ์์ผ๋ฉด ๋ถ๋ชจ ๋ค์์ ํ๊ธฐ
- class ํด๋์ค๋ช : ๋ถ๋ชจ๋ช , ํ๋กํ ์ฝ๋ช 1, ํ๋กํ ์ฝ๋ช 2 { }
- class ํด๋์ค๋ช
: ํ๋กํ ์ฝ๋ช
{ }
- ๋ถ๋ชจ๊ฐ ์์ผ๋ฉด ๋ฐ๋ก ํ๊ธฐ๊ฐ๋ฅ
- class ํด๋์ค๋ช : ํ๋กํ ์ฝ๋ช 1, ํ๋กํ ์ฝ๋ช 2{ }
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ํ๋กํ ์ฝ์ ์ฑํ(adopt)ํ ์ ์๋ค.
protocol ํ๋กํ ์ฝ๋ช
{
ํ๋กํผํฐ๋ช
๋ฉ์๋ ์ ์ธ //๋ฉ์๋๋ ์ ์ธ๋ง ์์
}
protocol ํ๋กํ ์ฝ๋ช
: ๋ค๋ฅธ ํ๋กํ ์ฝ, ๋ค๋ฅธ ํ๋กํ ์ฝ2{
//ํ๋กํ ์ฝ์ ๋ค์ค ์์๋ ๊ฐ๋ฅ
}
ํ๋กํ ์ฝ๊ณผ ํ๋กํผํฐ/๋ฉ์๋ ์ ์ธ
- ์ด๋ฆ๋ง ์๊ณ , ๊ธฐ๋ฅ์ ์๋ค!
protocol SomeProtocol {
var x : Int { get set } //์ฝ๊ธฐ์ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅ
var y : Int { get } //์ฝ๊ธฐ์ ์ฉ
static var tx : Int { get set } //ํด๋์คํ๋กํผํฐ๋ ์ธ ์ ์์
static func typeMethod() //๋ฉ์๋ ์ด๋ฆ๋ง ์๊ณ ๊ธฐ๋ฅ์ ์์. (Void ํ์)
func random() -> Double //return๊ฐ ์์
}
protocolcol์ฑํ๊ณผ ์ค์
protocol Runnable {
var x : Int { get set }
func run()
}
class Man : Runnable { //์ฑํ, adopt
var x : Int = 1 // ์ค์, conform
func run() { print(" ๋ฌ๋ฆฐ๋ค~ ") } // ์ค์, conform
}
class Man์ x, run()์ ์ ์๋ค๋ฉด
- type 'Man' does not conform to protocol 'Runnable'
์์๊ณผ ํ๋กํ ์ฝ ์ฑํ(adopt)
- ViewContorllerํด๋์ค๋ ๋ถ๋ชจ UIViewController๋ฅผ ์์๋ฐ๊ณ , ํ๋กํ ์ฝ UIPickerViewDelegatedhk UIPickerViewDataSource๋ฅผ ์ฑํํ๋ค.
- ํ๋กํ ์ฝ UIPickerViewDelegate์ UIPickerViewDataSource์ ํ์ ๋ฉ์๋๋ ๋ชจ๋ ๊ตฌํํด์ผํ๋ ํ๋กํ ์ฝ์ ์ค์(conform)ํ๋ ๊ฒ์ด๋ค.
class ViewController : UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
- ์ด๊ฑฐํ
- ๊ด๋ จ์๋ ๋ฐ์ดํฐ๋ค์ด ๋ฉค๋ฒ๋ก ๊ตฌ์ฑ๋์ด ์๋ ์๋ฃํ
- ์์น ์๋ ๊ฐ์ด ์๋ชป ์ ๋ ฅ๋๋ ๊ฒ ๋ฐฉ์ง
- ์ ๋ ฅ ๋ฐ์ ๊ฐ์ด ํ์ ๋์ด ์์ ๋
- ํน์ ๊ฐ ์ค ํ๋๋ง ์ ํํ๊ฒ ํ ๋
- ์๊น
- ๋นจ๊ฐ, ๋ น์, ํ๋
- ์ฑ๋ณ
- ๋จ, ์ฌ
์ด๊ฑฐํ ์ ์
enum ์ด๊ฑฐํ ๋ช
{
์ด๊ฑฐํ ์ ์
}
enum Planet {
case Mercury, Venus, Mars, Jupiter, Staturn, Uranus, Neptune
}//ํ๋์ case๋ฌธ์ ๋ฉค๋ฒ๋ค ๋์ดํ๋ ๊ฒ๋ ๊ฐ๋ฅ
enum Compass {
case North
case Sousth
case East
case West
}
var west = Compass.West
print("\(type(of: west))") //Compass
west = .North //ํ์
์๋ต
print(west) //North
- ๋ฌธ๋งฅ์์ ํ์ ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ ์์ (๋ฑํธ ์ข๋ณ์ ๋ณ์ ํ์ ์ด ํ์ ์ ์ผ ๋)์๋ ์ด๊ฑฐํ๋ช ์๋ต๊ฐ๋ฅ
์ด๊ฑฐํ ๋ฉค๋ฒ๋ณ ๊ธฐ๋ฅ ์ ์
enum Compass {
case North
case Sousth
case East
case West
}
var direction : Compass
direction = .South
switch direction {
case .North : //direction์ด .North์ด๋ฉด "๋ถ"์ถ๋ ฅ
print("๋ถ")
case .South :
print("๋จ")
case .East :
print("๋")
case .West :
print("์")
}
์ด๊ฑฐํ ๋ฉค๋ฒ์๋ ๋ฉ์๋๋ ๊ฐ๋ฅ
enum Week : String {
case Mon, Tue, Wed, Thur, Fri, Sat, Sun
func printWeek(){ //๋ฉ์๋๋ ๊ฐ๋ฅ
switch self {
case .Mon, .Tue, .Wed, .Thur, .Fri :
print("์ฃผ์ค")
case .Sat, .Sun :
print("์ฃผ๋ง")
}
}
}
Week.Sun.printWeek() //์ฃผ๋ง
์ด๊ฑฐํ์ rawValue
enum Color : Int { //Hashable ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ธฐ๋ณธ์๋ฃํ
case red = 0
case green
case blue
}
print(Color.red) //red
print(Color.blue) //blue
print(Color.red.rawValue) //0
print(Color.blue.rawValue) //2
Stingํ ๊ฐ์ ๊ฐ๋ ์ด๊ฑฐํ์ rawValue
enum Week: String {
case Monday = "์"
case Tuesday = "ํ"
case Wednesday = "์"
case Thursdat = "๋ชฉ"
case Friday = "๊ธ"
case Saturday //๊ฐ์ด ์ง์ ๋์ง ์์ผ๋ฉด case์ด๋ฆ ํ ๋น๋จ
case Sunday
}
print(Week.Monday) // Monday
print(Week.Monday.rawValue) // "์"
print(Week.Sunday) // Sunday
print(Week.Sunday.rawValue) // Sunday ==>Stringํ์ด๊ธฐ ๋๋ฌธ์ case ๋ฉค๋ฒ์ด๋ฆ ๊ทธ๋๋ก ํ ๋น
์ฐ๊ด ๊ฐ(associated value)์ ๊ฐ๋ Eunm
enum Date {
case intDate(Int,Int,Int)
case stringDate(String)
}
var todayDate = Date.intDate(2020,4,30)
todayDate = Date.stringDate("2020๋
5์ 20์ผ")
switch todayDate {
case .intDate(let year, let month, let day) :
print("\(year)๋
\(month)์, \(day)์ผ)"
case .stringDate(let date) :
print(date) //"2020๋
5์ 20์ผ\n"
}
์ต์ ๋์ ์ฐ๊ด๊ฐ(associated value)์ ๊ฐ๋ Eunm
let age : Int? = 30
//์์์ธ๋ฐ ์ด๋ป๊ฒ case๋ฅผ ๊ฐ์ง ??? ์๋ ์ต์
๋ ์๋์๋ฆฌ ํ์ธ.
switch age {
case .none : //nil์ธ ๊ฒฝ์ฐ
print("๋์ด ์ ๋ณด๊ฐ ์์ต๋๋ค")
case .some(let a) where a < 20 :
print("๋ฏธ์ฑ๋
์ ์
๋๋ค")
case .some(let a) where a < 71 : //์ฑ์ธ์
๋๋ค.
print("์ฑ์ธ์
๋๋ค")
default :
print("๊ฒฝ๋ก ์ฐ๋์
๋๋ค.")
}
์ต์ ๋ ์๋์๋ฆฌ - ์ต์ ๋์ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์์ต๋๊น??
public enum Optional<Wrapped> {
case none
case some(Wrapped)
}
var x : Int? = 20 //some(20)
var y : Int? = Optional.some(10) //Optional์๋ตํ๊ณ .some๋ง ์ธ์๋ ์์
var z : Int? = Optional.none
var x1 : Optional<Int> = 30
print(x,y,z,x1)
- ๊ตฌ์กฐ์ฒด/enum์ ์ธ์คํด์ค๋ ๊ฐ ํ์ , ํด๋์ค์ ์ธ์คํด์ค๋ ์ฐธ์กฐํ์
- ๊ตฌ์กฐ์ฒด๋ ์์๋ถ๊ฐ
struct Recolution{ //๊ตฌ์กฐ์ฒด ์ ์
var width = 1024 //ํ๋กํผํฐ
var height = 76
}
let myComputer = Resolution() //์ธ์คํด์ค ์์ฑ
print(myComputer.width) //ํ๋กํผํฐ ์ ๊ทผ 1024
- ์ฌ์ฉ๋ฐฉ๋ฒ์ ํด๋์ค์ ๋์ผ
Maemberwise Initializer(๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ )
struct Recolution{
var width = 1024
var height = 76
} //init()๋ฉ์๋ ์๋ต !!
let myComputer = Resolution(width: 1000, height: 200)
//Maemberwise Initializer
print(myComputer.width) // 1000
- ๊ตฌ์กฐ์ฒด ํน์ง ==> ๋์ ์๋ณด์ด๋ ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ง. ์ด๊ธฐํํ๋ init๋ฉ์๋ ๋ง๋ค ํ์์์ด์ง
ํด๋์ค ๋ด์ ๊ตฌ์กฐ์ฒด
struct Resolution {
var width = 1024
var height = 76
}
class VideoMode {
var resolution = Resolution()
var frameRate = 0.0
}
let myVideo = VideoMode() //์์ ์ธ์คํด์ค
print(myVideo.resolution.width) //์ ๊ทผ
Swift์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ ๋ชจ๋ ๊ตฌ์กฐ์ฒด(์ผํน!!)
- public struct Int
- public struct Double
- public struct String
- public struct Array
ํด๋์ค/๊ตฌ์กฐ์ฒด/์ด๊ฑฐํ ๋น๊ต ๊ณตํต์ :
- ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค.
- [ ]๋ฅผ ์ฌ์ฉํด ์ฒจ์(subscript)๋ฌธ๋ฒ์ผ๋ก ๋ด๋ถ์ ๊ฐ์ ์ก์ธ์ค ํ ์ ์๋ ์ฒจ์๋ฅผ ์ ์ํ ์ ์๋ค.
- ์ด๊ธฐ ์ํ ์ค์ ์ ์ํ init()์ ์ ์ํ ์ ์๋ค
- extension์ ํตํด ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
- ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์๋ค.
ํด๋์ค๋ง ๋ ๊ฐ์ง๋ ํน์ง :
- ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ ์บ์คํ (is, as)์ ํตํด ์คํ ์์ ์ ํด๋์ค ์ธ์คํด์ค์ ํ์ ์ ํด์ํ๊ณ ๊ฒ์ฌํ ์ ์๋ค. //๋ฐํ์์์ ๊ฒ์ฌํด์ค.
- deinitํจ์๋ฅผ ์ฌ์ฉํด ์ฌ์ฉํ ์์์ ๋ฐํํ ์ ์๋ค
- ์ฐธ์กฐ ์นด์ดํ ์ ํตํด ํ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ์ฐธ์กฐ(์ฌ์ฉ)ํ ์ ์๋ค. //์ฝ ๋ฐ์ด ๋ ํผ๋ฐ์ค (์ฐธ์กฐํ์ ํน)
๊ตฌ์กฐ์ฒด๋ ๊ฐํ์ (Value type), ํด๋์ค๋ ์ฐธ์กฐํ์ (reference type)์ ๋๋ค,
์์ 1
//๊ตฌ์กฐ์ฒด - ๊ฐํ์
struct Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //๊ฐํ์
- kim์ ๊ฐ์ lee์ ํ ๋น
print(kim.age, lee.age) // 1, 1
lee.age = 20
print(kim.age, lee.age) // 1, 20
kim.age = 30
print(kim.age, lee.age) // 30, 20
//๊ฐ ํ์
์ ๋ณต์ฌํ ๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ํ๋ ๋ ์๊น
//ํด๋์ค - ์ฐธ์กฐํ์
class Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //์ฐธ์กฐํ์
- kim์ ์ฃผ์๋ฅผ lee์ ํ ๋น
print(kim.age, lee.age) // 1, 1
lee.age = 20
print(kim.age, lee.age) // 20, 20
kim.age = 30
print(kim.age, lee.age) // 30, 30
//์ฐธ์กฐ ํ์
์ ๋ณต์ฌํ ๋ ์ฃผ์๋ฅผ ๋ณต์ฌํด์ ํ ๋ฐ์ดํฐ์ reference๊ฐ 2๊ฐ ์๊น.
var lee = kim //์ฐธ์กฐํ์
- kim์ ์ฃผ์๋ฅผ lee์ ํ ๋น
- kim์ด ๋ฐ๋๋ฉด lee๋ ๋ฐ๋..
- lee๋ kim๊ณผ ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ.(ํ๋๊ฐ ๋ฐ๋๋ฉด ๊ณ์ ๋ฐ๋์ด ๋๊ฐ)
์์ 2
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var frameRate = 0
var name : String?
}
var hd = Resolution(width: 1920, height : 1080)
//Memberwise Initializer
//๊ทธ๋ฅ var hd = Resolution()์ผ๋ก ํ์ผ๋ฉด 0, 0์ (์ง์ ํด๋์ ์ด๊น๊ฐ)
var highDef = hd
//๊ตฌ์กฐ์ฒด๋ ๊ฐํ์
(value type)
print(hd.width, highDef.width) //1920, 1920
hd.width = 1024
print(hd.width, highDef.width) //1024, 1920
var xMonitor = VideoMode()
xMonitor.resolution = hd //var hd = Resolution(width: 1920, height : 1080) ์ด ๊ฐ์ด ๋ค์ด๊ฐ ์์
xMonitor.name = "LG"
xMonitor.frameRate = 30
print(xMonitor.frameRate) //30
var yMonitor = xMonitor
//ํด๋์ค๋ ์ฐธ์กฐํ์
yMonitor.frameRate = 25
print(yMonitor.frameRate) //25
print(xMonitor.frameRate) //25 //xMonitor๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์์ผ๋ yMonitor์ ๋์ผํ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์ฐธ์กฐ๋จ.
- call bu value vs call by regerence
- Swift์์ ์ ๊ณตํ๋ Int, Strinf, Array, Dictionary๋ฑ ๊ธฐ๋ณธ ์๋ฃํ๋ค์ ๊ตฌ์กฐ์ฒด๋ก ๋ง๋ค์ด์ ธ ์์ด์ call by value๋ฐฉ์์ด๋ค
- enum ๋ call by value๋ฐฉ์์ด๋ค
- ํด๋์ค๋ call by regerence๋ฐฉ์์ด๋ค.
์ธ์ ํด๋์ค๋ฅผ ์ฐ๊ณ ์ธ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฐ๋?
- ๊ตฌ์กฐ์ฒด๋ ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ฐ๋ค์ ํ๋ฐ ๋ฌถ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ ์ฒด ๋ฉ์ด๋ฆฌ ํฌ๊ธฐ๊ฐ ์์ ๊ฒฝ์ฐ, ๋ณต์ฌ๋ฅผ ํตํด ์ ๋ฌํด๋ ์ข์ ๊ฒฝ์ฐ ๊ตฌ์กฐ์ฒด
- ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๊ตฌ์กฐ์ฒด๊ฐ ๋ ์์ ํ๋ค
- ๊ตฌ์กฐ์ฒด๋ ๊ธฐ์กด ํ์
์ ํน์ฑ์ ์์ํ ํ์๊ฐ ์๋ค.
- ๋๋น, ๋์ด๋ฅผ ํํํ๋ ๊ธฐํํ์ ๋ชจ์์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ
- ์ขํ ์์คํ ์ ๊ฐ ์ขํ๋ฑ
- ๊ฐ๋จํ ๊ฒ๋ค์ ํด๋์ค๋ก ๋ง๋ค ํ์๋ ์์.
alloc, new, copy๋ก ์์ํ์ง ์๋ ๋ฉ์ธ์ง๋ก ์์ฑ๋ ์ค๋ธ์ ํธ๋ ๋ด๋ฒ๋ ค๋๋ฉด ์๋์ ์ผ๋ก ํด์ ๋๋ค.
๋ง์ฝ, ๊ทธ๋ฐ ์ค๋ธ์ ํธ ์ค์์ ๊ฐ์ข
์ผ๋ก ํด์ ๋๋ฉด ๊ณค๋ํ ๊ฒฝ์ฐ๋ retain์ ํธ์ถํ๋ค.
alloc, new, copy๋ก ์์ํ๋ ๋ฉ์ธ์ง๋ก ์์ฑ๋ ์ค๋ธ์ ํธ๋ฅผ ์๋์ผ๋ก ํด์ ํ๊ณ ์ถ์ ๋, autorelease๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค.
retain, release๋ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ์ฆ์์์ ์ฆ๊ฐ์ํค์ง๋ง, autorelease๋ ์ง์ฐํ๋ฉด์ ๋ ํผ๋ฐ์ค ์นด์ดํธ๋ฅผ ๊ฐ์ ์ํจ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)์ ๋๊ธ๋ง ํฌ์ธํฐ(deangling pointer) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ์ํ๊ฒ ๋ง์ด ํ ๋นํ๊ณ ์๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์์ด ๋ฐ์ํ๊ณ , ๋ฐ์ดํฐ ๊ฐ์ด ์๋ ๊ป๋ฐ๊ธฐ ํฌ์ธํฐ๊ฐ ์์ฑ๋๋ฉด, ๊ทธ ํฌ์ธํฐ๋ ๋๊ธ๋ง ํฌ์ธํฐ๊ฐ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ Stack / Heap / Data / Code(Data)๋ก ๋๋์ด์ง
- Stack : ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์ ์ ์ฅ๊ณต๊ฐ. os๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ. ์ฌ์ฉ๋ ๋ณ๋ ์์.
- Heap : ๋์ ํ ๋น. ๊ฐ์ฒด ์์ฑ์ ์ฌ๊ธฐ์ ์ ์ฅ. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋์. ์ฌ์ฉ๋ ๋ณ๋ ์์.
- Data : ์ด๊ธฐ๊ฐ์ด ์๋ ์ ์ญ๋ณ์. ํ๋ก๊ทธ๋จ ์ข ๋ฃ์ ํด์ . ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ผ์ .
- Code(Text) : ํ๋ก๊ทธ๋จ ์ฝ๋. ํ๋ก๊ทธ๋จ ์ข ๋ฃ์ ํด์ . ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ผ์ .
๊ฐ์ฒด ์ธ์คํด์ค
- Stack์ ํ ๋น ๋ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ฐธ์กฐํด์ Heap์์ญ์ ์๋ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์์.
- Stack์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ฒด์ ํฌ์ธํฐ ์ฃผ์๋ก๋ Heap์์ญ์ ์ ์ฅ๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ฃผ์๊ฐ๊ณผ ํด๋น ์ฃผ์์ ๊ฐ์ฒด๊ฐ ์ ํจํ์ง ์ ์ ์์.
- Stack์ ์ด๋ฏธ ํด์ ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ด ์ ์ฅ๋์ด ์์ ์ ์์ -> regerence count๋ก ๊ด๋ฆฌ
์คํ ์ค๋ฒํ๋ก์ฐ
- ํธ์ถ ์คํ์ ํ๋ก๊ทธ๋จ ์์์ ์ผ์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๊ณต๋จ.
- ํ์ง๋ง ์ ์๋ ์์ ์ฃผ์ ๊ณต๊ฐ ์ด์์ ์ฌ์ฉํ ๋, '์คํ ์ค๋ฒํ๋ก์ฐ'๊ฐ ๋ฐ์ํจ. (ํ๋ก๊ทธ๋จ ์ถฉ๋ ๋ฐ์)
- ๋ฌดํ ๋ฃจํ ํน์ ์ฌ๊ทํจ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ Exception๋ฐ์์ผ๋ก ์ง์ญ๋ณ์๊ฐ ๋งค๊ฐ๋ณ์๊ฐ ์ ๋๋ก unwind๋์ง ์์ ๊ฒฝ์ฐ์
ํจ์(๋ฉ์๋)์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์
๊ฐ๊ฐ์ ํจ์๋ ์คํ๋ ๋, ์คํ์ ํ๋ ์์ ํํ๋ก Push ๋จ. ๊ฐ ํจ์๊ฐ ๋๋ ๋๋ง๋ค ํด๋น ํ๋ ์์ ์คํ์ ๊ผญ๋๊ธฐ์์ pop๋จ
MMR(MRC) : ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- init ๊ณ์ดํจ์ + alloc, retain, copy = > reference count + 1 ์ํด
- release, autorelease => regerence count - 1 ์ํด
==> alloc, retain, copy์ ๊ฐฏ์์ release, autorelease์ ๊ฐฏ์๊ฐ ๋์ผํด์ผํจ
-
alloc : ํด๋น ๊ฐ์ฒด ์์ฑ๋ ๋์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (rc + 1)
-
retain : rc + 1
-
copy : ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ ํ ๋ณต์ฌ๋ณธ์ rc + 1
-
release: rc - 1
-
autorelease: autoreleasepool ์ด ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง ๋ ๊ฐ์ฒด๋ ๋์์ ์ฌ๋ผ์ง.
reference Count(Retain Count)
- ๊ฐ๊ฐ์ ๊ฐ์ฒด์ ๋ ํผ๋ฐ์ค ์นด์ดํธ ๊ฐ์ ๋ถ์ฌํด ํด๋น ๊ฐ์ฒด๊ฐ ๋ช ๋ฒ ์ฐธ์กฐ ๋๊ณ ์๋์ง๋ฅผ ํ๋จ ํ ์ ์์.
- ๋ ํผ๋ฐ์ค ์นด์ดํธ ๊ฐ์ด 0์ด ๋๋ ์ฆ์ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ์ํด
Swift ์์
- let firstinst = myClass() //์๋ก์ด ๊ฐ์ฒด ์์ฑ๋จ (rc1 = 1)
- let secondinst = myClass() // ์๋ก์ด ๊ฐ์ฒด ์์ฑ๋จ (rc2 = 2)
- let thirdinst = firstinst //๊ฐ์ฒด ์ฐธ์กฐํจ(rc1 = 2) ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ๋์์ ํด๋น ๊ฐ์ฒด์ rc + 1๋๋ฉฐ, ๋ฉ์๋ ์ข ๋ฃ์ rc - 1 ๋๋ค.
autoreleasepool
- ๊ฐ๊ฐ์ autorelease๋ ์ฐธ์กฐ๊ฐ์ฒด๋ฅผ pool์์ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ rc๊ฐ 0 ์ด๋๋ ์์ ์์ ๋ชจ๋ ์ฐธ์กฐ๊ฐ์ฒด๋ก ํ๋ฒ์ release๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ
- ํจ์์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ๋, ์์ฉํ๊ฒ ์ฐ์
NSString stringWithFormat
- alloc ์ด๋ init์ ์ฌ์ฉํ์ง ์์ ๋ณ๋์ retatin์ ํตํด rc + 1ํด์ค์ผ ํจ
- ๋จ, ์ด๋ฐ ๊ฐํธ ์์ฑ์๋ ์ค๋ธ์ ํธ ๋ด์์ releaseํ ์ฑ ์์ด ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ releaseํด ์ค ํ์๋ ์์(stringWithFormatํจ์ ๋ด์์ aytoreleaseํด์ autoreleasepool์ด release์ฒ๋ฆฌ) alloc + initWithFormat
- ๊ฐ์ฒด ์์ฑ๋ ๋์์ ์ด๋ฏธ rc๊ฐ 1๋ก ์ค์ ๋๋ฏ๋ก ๋ณ๋์ retain์์ ํ์ ์
- ๋จ, ๊ฐ๋ฐ์๊ฐ ์์ฑํ ๊ฐ์ฒด์ด๋ฏ๋ก releaseํ ์๋ฌด๊ฐ ๊ฐ๋ฐ์์๊ฒ ์์
ARC : ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- release, retain, reatinCount, autorelease๋ฅผ ์ฌ์ฉํ ์ ์์.
- ์๋์ผ๋ก ๊ด๋ฆฌํด์ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ : strong & weak & unwend ๋ฉํฐ์ค๋ ๋ ์์ฑ: atomic & nonatomic ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ฑ: readOnly, readWrite
Swift๋ ARC๋ฐฉ์์ ์ฑํํ๊ณ ์๊ณ , Objective-c๋ ์ต์ ๋ฒ์ ์ ARC๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ ๋ฏํจ. Objective-c์์ MRC๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด,
Xcode -> Build Settings > Apple LLVM 9.0 - Language - Objective C > Objective -C Automatic Reference Counting > NO๋ก ์ค์ ํ๋ฉด ๋จ.
์ฐธ๊ณ : https://www.clien.net/service/board/cm_app/1254304
- https://developer.apple.com/documentation/swift/1641736-print
- print์ ๋งค๊ฐ๋ณ์๋ 3๊ฐ (์ด์ ๊น์ง ์์ป๋ ๊ฒ)
func print<Target>(_ items: Any..., separator: String = " ", terminator: String = "\n", to output: inout Target) where Target : TextOutputStream
- items : Any... items๊ฐ ๋ช๊ฐ์ธ์ง ์ ์ ์๋ค...
separator : String = " "
,terminator: String = "\n"
๋ํดํธ์ธ์ = > ์์ด๋ ๋จ.- ์ถ๋ ฅํ๋ ๊ฒ์ ๊ณต๋ฐฑ์ฃผ๊ณ ์ถ์ผ๋ฉด
separator : String = " "
- ๋ชจ๋ ์์ดํ
์ด ์ถ๋ ฅ๋ ์ดํ์ ์คํ
terminator: String = "\n"
(๋ค์์ค๋ก ๋ด๋ ค๊ฐ)
๋์ด์ฐ๊ธฐ๊ฐ ๋ชจ๋ ์กด์ฌํจ.
print("์ผ ์ด ์ผ")
print("1 2 3") // 1 2 3
print(1, 2, 3) // 1 2 3
print(1.0, 2.0, 3.0) //1.0 2.0 3.0
print(1, 2, 3, separator: "HHH")//1HHH2HHH3HHH
for n in 1...3 {
print(n)
}
//1
//2
//3
for n in 1...3 {
print(n, terminator: " ")
}
// 1 2 3
- https://docs.swift.org/swift-book/LanguageGuide/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID158
- ์ํ์์ y = x +1 ๊ณผ ๊ฐ์ ๊ณต์๋ค์ ํจ์๋ผ๊ณ ์นญํจ.
- ์ด๋ค ์ ๋ ฅ๊ฐ(Argument, ์ธ์)์ ๋ฐ์ ์ด๋ฅผ ์ฌ๋ฃ๋ก ํน์ ๊ณ์ฐ์ ์ํํ๊ณ , ๊ณ์ฐ์ ๊ฒฐ๊ณผ๊ฐ(Return Value)์ ๋์ถํ๋ ์ผ๋ จ์ ๊ณผ์ .
- ๋ง์น, ๊ณต์ฅ์์ ๊ธฐ๊ณ(ํจ์)์ ์์ฌ๋ฃ(์ธ์)๋ฅผ ๋ฃ๊ณ , ๊ธฐ๊ณ๋ฅผ ๋๋ ค ์์ฑํ(๊ฒฐ๊ณผ๊ฐ)์ ๋ง๋๋ ๊ณผ์ ๊ณผ ์ ์ฌํจ. -> ์ด๋ค ์ผ์ ์ํํ๋ ์ฝ๋ ๋ฌถ์
- Class์ ํจ์๋ ํน๋ณํ ๊ตฌ๋ถ์ง๊ธฐ ์ํด Method๋ผ๊ณ ๋ถ๋ฆ.
- ์์)
func sayHello(name : String) -> String {
let qussk = "Hello, " + name
return qussk
}
func ํจ์๋ช
(ํ๋ผ๋ฏธํฐ๋ช
: ์๋ฃํ) -> ๋ฆฌํด์๋ฃํ {
ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ธ์๋ค๋ก ์ํํ ์ฝ๋๋ค
return ๋ฆฌํด๊ฐ
}
- func, ํจ์๋ช , ํ๋ผ๋ฏธํฐ, ๋ฆฌํด์๋ฃํ, ์ฝ๋๋ธ๋ญ๋ฑ 5๊ฐ์ง ์์ ์กด์ฌ.
func ํจ์๋ช
- func ํจ์์์ ์ ์ธ. ํจ์๋ช ์ด ์๋ ์ด์ ๋ ๋์ค์ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ํจ์๋ช ์ ํตํด ๋ถ๋ฅด๊ธฐ ์ํจ.
- Swift์์๋ CamelCase ๊ถ์ฅ. (์)myCamelCase)
parameter / argument
- ํจ์๋ช ๋ค์ ์ค๋ ์๊ดํธ๋ ํจ์์ ์์ฌ๋ฃ(์ธ์)๊ฐ ๋๋ ํ๋ผ๋ฏธํฐ(Parmaeter)๋ฅผ ํํํ๋ ๊ณณ.
- ํ๋ผ๋ฏธํฐ๋ช ๊ณผ ๊ฐ ํ๋ผ๋ฏธํฐ ์๋ฃํ(type)์ ์ง์ ํจ. ํจ์๊ฐ ์ ๋ ฅ๊ฐ์ ๋ฐ๋์ง ์ ๋ฌด์ ๋ฐ๋ผ ํ๋ผ๋ฏธํฐ๋ ์์ ์์ ์๋ ์๊ณ , ์ฌ๋ฌ ๊ฐ์ผ ์๋ ์์. ์ด๋ ๊ฒ ์ ์ธํ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ํ๋ผ๋ฏธํฐ์ ๋ค์ด์ค๋ ๊ฐ๋ค์ ์ธ์(Argument)๋ผ๊ณ ๋ถ๋ฆ.
return
- -> ํค์๋๋ ์ถ๋ ฅ๊ฐ (return๊ฐ)์ ํํํ๊ธฐ ์ํ ๊ตฌ๋ถ์.
- ์๋ฃํ์ ์ง์ ํ ๋, ํ๋ผ๋ฏธํฐ์ฒ๋ผ ์์์๊ฑฐ๋, ์ฌ๋ฌ ๊ฐ ์ผ ์ ์์ผ๋ฉฐ, ์์์ ์ด๋ฆ์ ์ง์ ํด์ค ์๋ ์์.
- ๋ง์ฝ, ->์ ํตํด ๋ฆฌํด ์๋ฃํ(return type)์ ์ง์ ํด์คฌ๋ค๋ฉด, ์ฝ๋ ๋ธ๋ญ์ ๋งจ ๋ง์ง๋ง์๋ ๋ฐ๋์ return์ด ์์ด์ผ ํ๋ฉฐ, ๋ฆฌํดํ๋ ๊ฐ์ ์์์ ์ง์ ํ ์๋ฃํ(type)๊ณผ ๊ฐ์ ์๋ฃํ์ด์ด์ผํจ.
- ์๋ฃํ์ด ์ง์ ๋์ด ์์ง ์๋ค๋ฉด Void๋ฅผ ๋ฆฌํดํจ. () -> Void.
์ธ์๊ฐ ๋ฐ๊ธฐ
- ํจ์๋ ์ ๋ ฅ๊ฐ์ ๋ฐ์ ์๋ ์๊ณ ๋ฐ์ง ์์ ์๋ ์์.
- ์ ๋ ฅ๊ฐ์ ๋ฐ๋ ํจ์๋ฅผ ์ ์ธํ ๋, ์ ๋ ฅ๊ฐ๋ค์ ์ํด ์ง์ ์์ ์ด๋ฆ๋ค์ ํ๋ผ๋ฏธํฐ(parameter)๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ค์ ํจ์๋ฅผ ์ฌ์ฉํ ๋(call) ๋ค์ด์ค๋ ์ ๋ ฅ๊ฐ๋ค์ ์ธ์(argument)๋ผ๊ณ ๋ถ๋ฆ.
- ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํจ์๋ช ๊ณผ ๋๋ถ์ด ํ๋ผ๋ฏธํฐ์ ๋์ํ๋ ์ธ์๊ฐ๋ค์ ๋ชจ๋ ์ ๋ ฅํด์ผํจ.
func setUI(title : String, image : String) -> String {
return title + image
}
setUI(title : "์ ๋ชฉ", image: "๋๋ฌด")
ํ๋ผ๋ฏธํฐ / ์ธ์๋ ์์
- ํ๋ผ๋ฏธํฐ๋ ์ด๋ฏธ ์์๋ก ์ด๋ฆ ์์ let ํค์๋๊ฐ ์จ์ด ์์
- ์์์ด๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ์ ๋ค์ด์จ ์ธ์๊ฐ์ ์์๋ก ๋ณ๊ฒฝํ ์ ์์.
- ๋ณ๊ฒฝํ๋ ค๋ฉด ํจ์ ๋ด์์ ์๋ก์ด ๋ณ์๋ฅผ ๋ง๋ ํ ์ธ์๊ฐ์ ๋์ ํ์ฌ ๋ค์ ๋ณ์๊ฐ์ ๋ณ๊ฒฝํด์ผํจ.
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ inout์ ์ธ ์๋ ์์.
- ์์)
func aboutMe(name : String, age : Int) -> String {
var newName = name //name ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณํํ ๊ฐ์ ์ ๋ณ์์ ๋์
newName = "์ค๋"
retrun "My name is \(newName). I am \(age) years old"
}
aboutMe(name: "Qussk", age: 29)
//"My name is Qussk. I am 29 years old"
Value Type ์ธ์๋ค
- String, Int, Bool ๋ฑ ์ฃผ๋ก ์ธ์๊ฐ์ผ๋ก ์ค๋ ๊ฒ๋ค์ ์๋ฃํ์ struct๋ก์ value type์.
- ๋ฌด์จ ๋ง์ด๋, ์ธ์๊ฐ๋ค์ ์๋ณธ์ด ๋ค์ด์ค๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ณธ์ ์๋ก ๋ง๋ค์ด ํจ์ ์์์ ์ฌ์ฉํ๋ค๋ ๋ป.
- ๊ทธ๋์ ํจ์ ์์์ ์ธ์๊ฐ๋ค์ ๋ง๊ตฌ ๋ณํํด๋ ์ธ์๊ฐ๋ค์ ์๋ก์ด ์ฌ๋ณธ์ด๊ธฐ ๋๋ฌธ์ ์ธ์๊ฐ๋ค์ ์๋ณธ์ ๊ทธ๋๋ก ์ด๊ฒ ๋จ.
์ธ๋ถ์ด๋ฆ arhument Label / ๋ด๋ถ์ด๋ฆ Parameter name
- ํจ์ ํ๋ผ๋ฏธํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์์. ํจ์๋ฅผ ๋ถ๋ฅผ ๋(call) ์ธ๋ถ์์ ๋ถ๋ฅด๋ ์ธ์ ์ด๋ฆ(argument label, ์ external name)๊ณผ, ํจ์ ๋ด๋ถ์์ ์ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ(parameter name, ์ internal name).
- ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด
- ์ธ๋ถ, ๋ด๋ถ์ด๋ฆ ์ง์ ์ ๋ฐ๋ผ ํ๋ผ๋ฏธํฐ๋ช ์ ์ฌ๋ฌ๊ฐ์ง ์ ํ์ผ๋ก ๋๋ ์ ์์. ์๋ฅผ ๋ค๋ฉด, _ ์์ผ๋์นด๋ ํค์๋๋ก ์๋ต์ด ๊ฐ๋ฅํด์ง
Variadic Parameter
- ํจ์๊ฐ ํ๋์ ์ธ์๋ฅผ ๋ฐ์ ๊ฒ์ธ์ง ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ ๊ฒ์ธ์ง ๋ถ๋ถ๋ช ํ ๋, ํจ์์ ํ๋ผ๋ฉํฐ ์๋ฃํ(type)์ **...**์ ์ฐ์ด Variadic Parameter๋ฅผ ๊ตฌ์ฑํด์ค.
func catsHello(catsNames : String...) -> String {
var hiMessage = "Hello"
for i in catsNames {
hiMessage = hiMessage + i + " "
}
retrun hiMessage
}
catsHello(catNames: "PaPa") //Hellow PaPa
catsHello(catNames: "PaPa", "KaKa", "HoHo")
//Hellow PaPa KaKa HoHo
์ด๋ฌํ Variadic Parmeter๋ ํจ์๋น ํ๋ ๋ฐ์ ์ฌ ์ ์๊ณ , ๋ฐ๋์ ๋ง์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๋์ด์ผํจ. ์ด์ ๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถ ํ ๋ ์ธ์๊ฐ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ฝค๋ง๋ฅผ ์ฐ๊ฒ ๋๋๋ฐ, ๊ท์น์ด ์๋ค๋ฉด Variadic์ธ์์ ์๋ ์ธ์๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ ์์ด๊ฒ ๋๊ธฐ ๋๋ฌธ.
inout Parameter + &
- ์์ ์์๋ค๋ก ํ๋ผ๋ฏธํฐ/์ธ์๊ฐ์ ์์๋ก ๋ฐ๊ฟ ์ ์๊ณ , ๋ฐ๊พธ๋ ค๋ฉด ํจ์ ๋ด์ ๋ณ๋์ ๋ณ์๋ฅผ ๋ง๋ค์ด ์ธ์๊ฐ์ ๋์ ์ํจํ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ์ผ์. ํ์ง๋ง ๋ ๊ฐ๋จํ๊ฒ ํ๋ผ๋ฏธํฐ ์๋ฃํ ์์ inoutํค์๋๋ฅผ ๋ฃ์ผ๋ฉด ๋จ.
- inoutํค์๋๋ฅผ ๋ถ์ฌ ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ ๊ฐ๋ ฅํ ๊ถํ์ ๊ฐ์ง.
- ํจ์ ๋ฐ์ ์๋ ๋ณ์๋ฅผ ์ธ์๋ก ๋ฐ์ ํจ์ ์์์ ์ธ์๊ฐ์ ๋ณ๊ฒฝ ํ ์ ์๊ฒ ๋๋ฉฐ, ๋์๊ฐ ์ธ์๋ก ์ฐ์ธ ํจ์ ๋ฐ ๋ณ์์ ๊ฐ๊น์ง ๋ณ๊ฒฝํ๊ฒ ๋จ.
- ํจ์์ ์๊ณผ ๋ฐ ๋ชจ๋๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ inout์ด๋ผ๋ ์ด๋ฆ ๋ถ์.
- inoutํค์๋๋ฅผ ๋ถ์ฌ ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ ํธ์ถ์ ์ด๋ฆ ์์ & ํค์๋๋ฅผ ๋ถ์. ์๋์ ์์๋ ๋ ์ซ์ ๋ณ์์ ๊ฐ์ ์๋ก ๋ค๋ฐ๊พธ๋ ํจ์ ์ด์ฉ์ inout patameter๊ฐ ์ฌ์ฉ๋จ.(Apple Swift๋ฌธ์ ์์)
- ์์)
func swapTwoInts(a: inout Int, b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(a: &someInt, b: &anotherInt)
print("someInt is \(someInt), anotherInt is \(anotherInt)")
//someInt is 107, anotherInt is 3
์๋ฃํ์ผ๋ก์จ์ ํจ์(func Type)
- Xcode์์ cmd + ํด๋ฆญ์ help ๋ณด๋ฉด. (int, int) -> int, (Stfing, Int) -> String๊ฐ์ ๊ฒ๋ค์ด ํจ์ ์๋ฃํ.
- ์์ ์๊ดํธ๋ Tuple์ ํํํ๋ค๊ธฐ ๋ณด๋ค, ํ๋ผ๋ฏธํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ํ์ํ๋ ๊ฒ์. ๊ทธ๋์ ํ๋๋ฉด (String) -> String.
- ์์) ๋ณ์์ ํจ์๊ฐ ๋์ ๋ ๊ฒฝ์ฐ
//์์์ ๋ง์
ํจ์
func add (s1: Int, s2: Int) -> Int {
return s1 + s2
}
//๋ณ์์ ํจ์ ๋์
. ํด๋น ๋ณ์๋ (Int, Int) -> Int ์๋ฃํ์ ๊ฐ๊ฒ ๋จ
var myMathVariable = add
//๋ณ์๊ฐ ํจ์์ฒ๋ผ ์ฌ์ฉ๋จ
myMethVariable(5,2) //7
- ๋ชจ๋ ํจ์๋ ์๋ฃํ์ ๊ฐ๊ณ ์ธ์๊ฐ๋ค์ ๋ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ํ ์ถ ํ ๋, ์ธ์๊ฐ, ๊ฒฐ๊ณผ๊ฐ๋ค ๋ชจ๋ ๊ฐ๋ณ์ ์ธ ์๋ฃํ์ ๊ฐ๊ณ ์์. ํจ์๊ฐ ์๋ฃํ์ ๊ฐ์ง์ผ๋ก์จ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๊ฐ์ ์์ฝ๊ฒ ๋ฃ์ ์๋, ์ด๋ค ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ๋ค์ ํจ์๊ฐ ๋์ฌ ์ ์๊ฒ ๋๋ ๊ฒ์. ์ฆ, ํจ์๋ผ๋ฆฌ ์ฐ๊ฒฐํด์ง๊ธฐ ์ฌ์์ง.
- ์์2) ํจ์์ ์ธ์๋ผ ๋ฆฌํด ๊ฐ๋ ํจ์ ์๋ฃํ์ผ ์ ์์.
func add(s1: Int, s2: Int) -> Int {
return s1 + s2
}
func mathResult(mathfunction: (Int, Int) -> Int
, s1: Int, s2: Int) -> String {
return "Result: \(mathFunction(s1,s2))"
}
print(mathResult(mathDunction: add, s1: 5, s2: 2)// Result: 13
์์ mathResult๋ mathfunction, s1,s2 ๋ผ๋ 3๊ฐ์ง ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ๊ณ ์๋ ํจ์. mathfunction๋ผ๋ ํ๋ผ๋ฏธํฐ๋ 2๊ฐ์ ์ ์๋ฅผ ๋ฐ์ 1๊ฐ์ ์ ์๋ฅผ ๋ฆฌํดํ๋ ํจ์ ์๋ฃํ.
- ์์3) ํจ์์ ๋ฆฌํด ๊ฐ์ด ๋ค์ ํจ์๊ฐ ๋๋ ๊ฒ์ ์
func add(s1: Int, s2: Int) -> Int {
return s1 + s2
}
func multiply(s1: Int, s2: Int) -> Int {
return s1 + s2
}
func addOrMultiply(isAdd: Bool) -> (Int, Int) -> Int {
if isAdd {
return add
} else {
return muliply
}
}
addOrMultiply(isAdd: true)(5,10)
//Result: 7
- ์ฐธ๊ณ : ๋ฆฌํด๊ฐ์ด ์๋(void)ํจ์์ ์๋ฃํ์ () -> () ๋ก ํ์ํ์ง ์๊ณ , () -> Void๋ผ๊ณ ํ์ํจ.
- optional์ธ ๋ณ์๋ nil ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋ ๋ณ์๋ฅผ ๋ปํจ.
- ๊ฐ์ ๋ฐํํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ์ ์ต์
๋ ํ์
์ด๋ผ๋ ๊ฐ์ฒด๋ก ๊ฐ์ธ์ ๋ฐํํจ
- Int("100")์ 100์ด ์๋ Optional(100)์ ๋ฆฌํดํจ, Print(Int("100")),Intํ initializer
- Int("Hi")์ ์ ์๊ฐ์ ๋ฐํํ ์ ์์, ์๋ฌด๋ฐ ๊ฐ๋ ๋ฐํํ ์ ์๋ค๋ ์๋ฏธ๋ก nil๋ฐํ.
- Swift์์ ๊ธฐ๋ณธ ์๋ฃํ(Int,Double,String๋ฑ)์ nil๊ฐ์ ์ ์ฅํ ์ ์์
- nil๋ ์ ์ฅํ๋ ค๋ฉด ์ต์ ๋ ํ์ ์ผ๋ก ์ ์ธํด์ผํจ
- ์ต์ ๋ ํ์ ์ ๋ณ์ ๋๋ ์์์ ์๋ฌด๋ฐ ๊ฐ์ด ํ ๋น๋์ง ์๋ ์ํฉ์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ ๊ณต
- ๊ฐ๋ฐ์๊ฐ ์ฌ๊ธฐ๋ ๊ฐ์ด ์์ ์ ์๋ค๊ณ "?"๋ก ๋ช ์.
- var index : Int? ์ฒ๋ผ ์ต์ ๋ "?"์ ๋ถ์ฌ์ฃผ์ด์ optional ๋ณ์๋ก ๋ง๋ฆ.
- index ๋ณ์๋ ์ ์๊ฐ์ ๊ฐ๊ฑฐ๋ ์๋ฌด ๊ฐ๋ ๊ฐ์ง ์์ ์ ์์(nil)
์ต์ ๋ ์ฌ์ฉํ๋ ์ด์ ?
- ์ต์ ๋ ํ์ ๋ง์ด ๊ฐ์ ๊ฐ์ง ์๋๋ค๋ ์๋ฏธ์ nil๊ฐ์ ๊ฐ์ง ์ ์์
- You set an optional variable to a nalueless state by assihning it the special value nil.
- nil๊ฐ์ ์ต์
๋์ด ์๋ ๋ณ์๋ ์์์ ํ ๋น ํ ์ ์์
- var myInt = nil //error
- var myInt : Int? = nil // Ok
- var myInt : Int? // Ok
- ์ต์ ๋ ๋ณ์๋ ์ด๊ธฐํํ์ง ์์ผ๋ฉด ์๋์ผ๋ก nil๋ก ์ด๊ธฐํ
- var myString: String = nil //์ ํจํ์ง ์์ ์ฝ๋
- let myConstant = nil //์ ํจํ์ง ์์ ์ฝ๋
- ์ต์ ๋ ์ธ๋ํ
- ์ต์ ๋ ๋ณ์์ ๊ฐ์ด ์์ผ๋ฉด ์ต์ ๋๋ก "๋ํ๋์๋ค(wrapped)๋ผ๊ณ ํจ"
- ์ต์ ๋์ ๋ํ๋ ๊ฐ์ ๊ฐ์ ์ธ๋ํ(forced unwrapping)์ผ๋ก ํ์ด์ค
- optional๋ก ์ ์ธ๋ ๋ณ์์ nil์ด ์๋๋ผ ๊ฐ์ด ๋ถ๋ช ํ ๋ค์ด์๋ค๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ !์ฌ์ฉ(์ธ๋ํ ํค์๋ = !)ํ์ฌ ๊ฐ์ ๊บผ๋.
- ! ์ ์ผ๋๋ฐ ๋ถ๊ตฌํ๊ณ nil ์ด ๋ค์ด์์๋ค๋ฉด ์๋ฌ๋ฅผ ์ผ์ผํด์ผ๋ก ์ฃผ์ ํ์.
var x : Int? // ์ต์
๋ ์ ์ํ ๋ณ์ x์ ์ธ
x = 10
print(x) // Optional(10)
print(x!) // forced unwrappingํด์ ์ ์ 10์ด ๋์ด
var x : Int?
x = 10
if x != nil { print(x!) } else { print ("nil") }
var x1 : Int? //==> ์ด๊น๊ฐ ์์ผ๋ฉด ๋ฌด์กฐ๊ฑด nil
x1 != nil { print(x1!) } else { print("nil") }
- var x : Int? // ์ต์ ๋ ์ ์ํ ๋ณ์ x ์ ์ธ
- x = 10 //์ฃผ์์ฒ๋ฆฌํ๋ฉด ?
- print(x) //Optional(10)
- print(x!) //forced unweappingํด์ 10์ด ๋์ด
- ์ต์ ๋ ๋ณ์๊ฐ nil๊ฐ์ผ ๋ ๊ฐ์ ์ธ๋ํํ๋ฉด crash๋์, nil์ด ์๋ ๋๋ง ์ธ๋ํ ํด์ผํจ.
?๋ ์๋ฃํ ๋ค
!๋ ๋ณ์๋ช
๋ค
- ๊ฐ์ ์ธ๋ํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, ์ต์ ๋ ๋ฐ์ธ๋ฉ(Optional binding)์ ์ด์ฉํ์ฌ ์ต์ ๋์ ํ ๋น๋ ๊ฐ์ ์์ ๋ณ์ ๋๋ ์์์ ํ ๋น
- ! (์ธ๋ํ)์ ์ฌ์ฉํ์ง ์๊ณ ์๋ก์ด ์์๋ฅผ ์ ์ธํ ๋ค ์์์ ์ต์ ๋ ๋ณ์์ ๊ฐ์ ๋ฃ์ด๋ณด๊ณ , nil์ด ์๋๋ฉด ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
- if let nonOptionalVariable = OptionalVariable { ์ฐ์ฐ } ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ.
if let constantName = optionalName{
//์ต์
๋ ๋ณ์๊ฐ ๊ฐ์ด ์๋ค๋ฉด ์ธ๋ํํด์ ์ผ๋ฐ ์์constantName์ ๋์
ํ๊ณ ์ฐธ์ด๋๋ฉด if๋ฌธ ์คํ
//๊ฐ์ด ์๋ค๋ฉด if๋ฌธ์ ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด ๋์ด if๋ฌธ์ ์คํํ์ง ์์
}
if var variableName = optionalName{
//์ต์
๋ ๋ณ์๊ฐ ๊ฐ์ด ์๋ค๋ฉด ์ธ๋ํํด์ ์ผ๋ฐ ๋ณ์ variableName์ ๋์
ํ๊ณ ์ฐธ์ด๋๋ฉด if๋ฌธ ์คํ
//๊ฐ์ด ์๋ค๋ฉด if๋ฌธ์ ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด ๋์ด if๋ฌธ์ ์คํํ์ง ์์.
}
var x : Int?
x = 10
if let xx = x { print(xx) } else { print("nil") } //10
var x1 : Int?
if let xx = x1 { print(xx) } else { print("nil") }//nil
}
//xx๋ IF๋ฌธ ์์์๋ง ์ธ ์ ์์
if let xx = x
์์ x๊ฐ xx์ ๋์ ๋๋ ์๊ฐ, ์ต์ ๋x๊ฐ ์๋๋ผ ๊ทธ๋ฅ x๋ก ๋ฐ๋if ๋ฌธ์ด ์ฐธ์ด ๋ผ์ print(xx)
์คํ
์ฌ๋ฌ ์ต์ ๋์ ์ธ๋ํ ์ฌ๋ฌ ์ต์ ๋ ๋ณ์๋ฅผ ํ๋ฒ์ ์ธ๋ํํ๋ ๋ฐฉ๋ฒ์ ์ฝค๋ง(,) ์ฌ์ฉ
var pet1 : String?
var pet2 : String?
pet1 = "cat" //Optional("cat")
pet2 = "dog" //Optional("dog")
if let firstPet = pet1, let secondPet = pet2 {
print(firstPet, secondPet) // cat dog
}else{
print("nil")
}
- ์ต์ ๋ ๊ฐ์ด์๋ค๊ฐ ์์์ ๋์ ํ์ฌ ์ต์ ๋ ํ๋ฆผ.
var x : Int?
var v : Int?
x = 10
y = 20
if let xx = x {
print(xx)
}else{
print("nil")
}
if let yy = y {
print(yy)
}else{
print("nil")
}
- ์๋ฌต์ ์ธ๋ํ : ํ์ง๋จ
- ์ต์ ๋์ด ํญ์ ์ ํจํ ๊ฐ์ ๊ฐ์ง ๊ฒฝ์ฐ ์ต์ ๋์ด ์๋ฌต์ ์ธ ์ธ๋ํ(implicitly unwrapping)์ด ๋๋๋ก ์ ์ธํ ์๋ ์์
- ํด๋์ค ์ด๊ธฐํ์์ ๋ง์ด ์ฌ์ฉ
- ์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ ๋์ด ์ ์ธ๋๋ค๋ฉด ๊ฐ์ ์ธ๋ํ์ด๋ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ํ์ง ์์๋ ๊ฐ์ ์ ๊ทผํ ์ ์์
- ์๋ฌต์ ์ธ ์ธ๋ํ์ผ๋ก ์ต์ ๋์ ์ ์ธํ๊ธฐ ์ํด์๋ ์ ์ธ๋ถ์ ๋ฌผ์ํ(?) ๋์ ์ ๋๋ํ(!)๋ฅผ ์ฌ์ฉ
var x : Int? //์ต์
๋ ๋ณ์ ์ ์ธ๋ฐฉ๋ฒ 1
var y : Int! //์ต์
๋ ๋ณ์ ์ ์ธ๋ฐฉ๋ฒ 2
x = 10
y = 20
print(x,y) // Optional(10), Optional(20)
//Swift4๋ฒ์ ๊น์ง y๋ ๊ทธ๋ฅ 20์ด ๋์์. Swift5๋ถํฐ๋ Optional(20)
์๋ฌต์ ์ธ๋ํ ์ต์ ๋(implicitly unweapped optional)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ํ๋กํผํฐ๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ ๊ฒฝ์ฐ
- Interface Builder outlet(IB outlet)์ ํญ์ ์์ธ๋ ์ ๋์์ ์ฐพ์ ํ(ํ๋กํผํฐ์ ์ฐ๊ฒฐ๋์ด)์ด๊ธฐํ ๋จ
- ์ธํฐํ์ด์ค ๋น๋์์ Outlet์ด nil์ด ์๋๋ผ๋ ๊ฒ์ ์ฌ์ฉ ์ ์ ๋ณด์ฅํ ์ ์์
(์ค์!)์ต์ ๋์ ์ธ๋ํํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ
var x : String? = "Hi"
//1.Forced unwrapping - unsage.
x!
//==> ๊ฐ์ฅ๊ฐ๋จํ ๋ฐฉ๋ฒ : ๊ฐ์ ๋ก ์ธ๋ํ - ํ์ง๋ง ๊ฐ์ด nil์ผ ๊ฒฝ์ฐ ํฌ๋์ฌ๊ฐ ๋จ. ์์ ํ ๋ฐฉ๋ฒ์ด ์๋
//2. Optional binding - safe
if let a = x {
print(a)
}
//==> ์ต์
๋ ๋ฐ์ธ๋ฉ์ผ๋ก a๋ผ๋ ๋ณ์,์์์ ์ต์
๋์ ๋์
ํ์ฌ ์ต์
๋์ ํ๋ฆฌ๊ฒํจ
//3.Optional chaining - safe
let b = x?.count
print(b)//์์,๋ณ์์ ๋์
ํ์ ์ง์ธ์ , Optional(2), !์จ์ผ 2๋์ด
//==> ?๋ก ์ ๊ทผํ๋ฉด ์ ์ฒด๊ฐ์ด ์ต์
๋ ๊ฐ์ผ๋ก ๋์ด
//4.Nil coalescing operator - safe //์ค์ํํธ์๋ง ์๋ ์ฐ์ฐ์
let c = x ?? ""
//==> nil์ผ ๊ฒฝ์ฐ ""๊ฐ์ผ๋ก ๋์น, nil์ด์๋๋ฉด x์ธ๋ฐ, ์ต์
๋์ด ํ๋ ค์ ๋ค์ด๊ฐ.
- https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html#//apple_ref/doc/uid/TP40014097-CH21-ID245
- Optional Chaining์ด๋, ๊ฐ์ด nil์๋ ์๋ ํ๋กํผํฐ, ๋ฉ์๋, ์๋ธ์คํฌ๋ฆฝํธ ๋ฑ์ ์ฒด์ธ์ฒ๋ผ ๊ธธ๊ฒ ์ด์ด๊ฐ๋ฉด์ ์ ์ธํ๋ ๊ฒ์ ์ผ์ปฌ์.
- ๊ฐ ๊ฐ๋ค ๋ค์ ? ๋ฅผ ๋ถ์ด๋ฉด์ ์ด์ด๊ฐ๊ฒ ๋จ.(instance.property?.method?.property?๋ฑ์ผ๋ก ์ด์ด์ง ๊ตฌ์กฐ๋ก ์ข์์ ์ฐ๋ก ์ด๋ํ๋ฉด์ ๊ฐ์ด nil์ด ์๋์ง ํ๋ณ.
- ๊ทธ ์ค ํ๋๋ผ๋ nil๋ก ํ๋ช ๋๋ค๋ฉด ์ด๋์ ๋ฉ์ถ๊ณ ๋ฐ๋ก ์ฒด์ธ ์ ์ฒด์ ๊ฒฐ๊ณผ๊ฐ์ด nil์ด๋จ.
- ์ธ๋ํ๊ณผ ๋ฌ๋ฆฌ, ์ฒด์ด๋์ ๋ฐํ์ ์๋ฌ ๋์ nil ๊ฐ์ ๋ฐํํ๋ ํน์ง(๊ทธ๋์ ์ฒด์ด๋์ ๊ฒฐ๊ณผ๋ ํญ์ ์ต์ ๋์)
์ต์ ๋ํ์ ํ๋กํผํฐ๋ ๋ฉ์๋ ํธ์ถ ๋ค์ "?"์ฌ์ฉ
- ์ ์ธํ ๋๋ ์๋ฃํ ๋ค์ ?ํจ(Int)
- (pLocation?.coordinate.latitude)!
- tabBarController?.selectedIndex = 1
- cell.textLabel?.text = items[(indexPath as NSIndexPath).row]
- rectahleAdView?.delegate = self
- audioPlayer?.volume = volumeControl.value
- audioRecoder?.recording
- audioRecoder?.record()
- locationManager?.requestWhenInUseAuthoriazation()
์ต์ ๋ ์ฒด์ด๋์ ์ฐ๋ ์ด์
- ์ต์ ๋ ํ์ ์ผ๋ก ์ ์๋ ๊ฐ์ด ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ ๋, ๋ค์ค if๋ฅผ ์ฐ์ง ์๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด
- ์ต์ ๋ ํ์ ์ ๋ฐ์ดํฐ๋ ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ค
- ์ฐ์ฐ์ ํ๊ธฐ ์ํด์๋ ์ต์ ๋์ ํด์ ํด์ผ ํ๋๋ฐ, ๋ง์ ์์ ์ต์ ๋ ํ์ ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ๋ค์ ํ๋ฒ ์ต์ ๋ ํ์ ์ผ๋ก ๋ณ๊ฒฝ์ ํ๋ฉด์ ํด์ ๋ฅผ ์์ผ์ค
//์ต์
๋ ์์ ์ต์
๋์ด ์๊ณ ๊ทธ๋ฌ๋ฉด if๋ฅผ ๋ฐ๋ณตํด์ผํจ.ใ
if let s = p.sns { //ํ๊ณ ๋ค์ด๊ฐ๊ณ ..
if let f = s.fb { //ํ๊ณ ๋ค์ด๊ฐ๊ณ ..
print("\(f.account)")
}
} //==> ์ด ๊ณผ์ ์ด ๊ท์ฐฎ๊ธฐ ๋๋ฌธ์
print("\(p.sns!.fb!.account)") ==> ์ด๋ ๊ฒ ์ญ ์จ์ฃผ๋ ๋ฐฉ๋ฒ๋ ์์.ํ์ง๋ง nil๊ฐ์ด ํ๋๋ผ๋ ์๋ค๋ฉด ํฌ๋์ฌ๋จ.
print("\(p.sns?.fb?.account)") ==> ๊ทธ๋์ ์ต์
๋ ์ฒด์ธ์ ์ฌ์ฉ.//๋ง์ฝ nil์ด ํ๋๋ผ๋ ์๋ค๋ฉด ์ ์ฒด๊ฐ nil๊ฐ์ผ๋ก ๋ฆฌํด ~ ์ ์ด๋ ํฌ๋์ฌ๋ ์ผ์ด๋์ง ์์.
์ต์ ๋ ์ฒด์ด๋ ์์
- ์ต์ ๋ ์์ ๋ด๋ถ์ ํ๋กํผํฐ๋ก ์ต์ ๋์ด ์ฐ์์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ ๊ฒฝ์ฐ ์ ์ฉ
- ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ์์ ๋๋ค๋ฅธ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๊ฐ ์์ ๋ ์ธ์คํด์ค๋ฅผ ์ ์ผ๋ก ์ฐ์ํด์ ์ ๊ทผ
- ํ๋กํผํฐ๊ฐ ์ต์ ๋์ธ ๊ฒฝ์ฐ nil์ธ์ง ์๋์ง ๋งค๋ฒ ์ฒดํฌ๋ฅผ ํด์ผํ๋ฏ๋ก ๋ฒ๊ฑฐ๋ก์
์์1
class Person{
var age: Int = 1
var addr: Address?
}
class Address {
var city = "Seoul"
}
let kim = Person() //kim์ addr์ nil๋ก ์ด๊ธฐํ
//print(kim.addr!.city) //error, ๊ฐ์ ์ธ๋ํ
print(kim.addr?.city) //nil, ์ต์
๋ ์ฒด์ด๋ํ๋ฉด ์ต์ข
๊ฒฐ๊ณผ๊ฐ ์ต์
๋๋ก ๋์ด, ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด nil
- ๊ฐ์ ๋ฃ๋ ๋ค๋ฉด,
let kim = Person()
kim.addr = Address() //์ฃผ์์ฒ๋ฆฌํ๋ฉด ์คํ๊ฒฐ๊ณผ
print(kim.addr?.city) //Optional("Seoul")
print((kim.addr?.city)!) // Seoul
if let pcity = kim.addr?.city { //(kim.addr?.city)!๊ฐ ๋จ ==> ์ต์
๋ ์ฒด์ด๋์ ๊ฒฐ๊ณผ์ ์ต์
๋ ๊ฐ์ด๋ฏ๋ก, ์ต์
๋๋ฐ์ธ๋ฉ ํด์ ์ฌ์ฉํจ
print(pcity) //Seoul
}else{
print("๋์๊ฐ ์ง์ ๋์ง ์์์ต๋๋ค.")
}
์์2
class Person {
var name: String?
var age: Int?
var sns: SNS? = SNS()
}
class SNS {
var fb : FaceBook? = FaceBook()
var tt : Twitter?
}
class FaceBook {
var account: String = "[email protected]"
}
class Twitter {
var account: String = ""
}
let p = Person()
if let s = p.sns {
if let f = s.fb {
print("1: \(f.account)") //"1: [email protected]\n"
}
}
if let account = p.sns?.fb?.account {
print("2: \(account)") //"2: [email protected]\n"
}
print("3: \((p.sns?.fb?.account)!)") //์ต์
๋ ์ฒด์ด๋ //"3: [email protected]\n"
print("4: \(p.sns!.fb!.account)") //์ต์
๋์ฒด์ด๋ ์๋//"4: [email protected]\n"
//print("5: \(p.sns?.tt?.account)") //nil
//print("5: \(p.sns!.tt!.account)") //error
- ์ต์ ๋ ์ฒด์ธ์ ํน์ฑ์ ์ต์ ๋ ์ฒด์ธ์ผ๋ก ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ ํด๋์ค์ ๊ฐ์ด nil์ด์ด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋ ๋ค๋ ๊ฒ๊ณผ ์ต์ ๋ ์ฒด์ธ์ผ๋ก ์ฝ์ด๋ธ ๋ง์ง๋ง ๊ฐ์ด ์ผ๋ฐ ํ์ ์ด๋ผ๋ ๋ชจ๋ ์ต์ ๋ ํ์ ์ผ๋ก ๋ฆฌํด๋๋ค๋ ๊ฒ์ด๋ค.
- ๋ฉ์๋์ ๊ฒฝ์ฐ ๊ดํธ ๋ค์์ ?ํจ p.getM()?
- ๊ฒฐ๊ณผ๊ฐ์ ์ต์ ๋ ์ฒด์ธ์ผ๋ก ์ฌ์ฉ
get์ผ๋ก ํ์ฉ๋ ์์
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
john.residence?.numberOfRooms //nil
john.residence = Residence()
john.residence?.numberOfRooms // Optional(1)
- ์ฒซ๋ฒ์งธ ์๋. residence๊ฐ ์ ํ ๋์ง ์์ nil๊ฐ ๊ฐ์ ธ์ด.
- residenceํ๋กํผํฐ ์ ๋ฌด์ ๋ฐ๋ผ ์ ์ฒด ์ฒด์ธ์ ๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋จ.
set์ผ๋ก ํ์ฉ๋ ์์
class Person {
var name : String
var house: House?
init(name: String) {
self.name = name
}
}
class House {
var region = "Seuol"
func printRegion() {
print(region)
}
}
var qussk = Person(name: "Qussk")
qussk.house?.printRegion() // nil(get)
qussk.house? = House() // nil(set) ํด๋น property๋ฅผ ์ธํ
ํ๋ ๊ณผ์ ์์๋ setting์ ์ nil์ด๋ฉด nil์ด ์คํ๋จ.
qussk.house?.printRegion() //nil
qussk.house = House()
qussk.house?.printRegion() // "Seuol"
: Error Handing
- ์์ธ์ฒ๋ฆฌ (exeption handing)
- ๋ฐํ์ ์ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ์๋ตํ๊ณ ๋ณต๊ตฌํ๋ ๊ณผ์
- Swift์์๋ optional์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ๋ฌด๋ฅผ ์ ๋ฌํจ์ผ๋ก์จ ์์ ์ ์ฑ๊ณต/์คํจ ์ ๋ฌด๋ฅผ ํ๋จํ ์ ์์ง๋ง ์์ ์ด ์คํจํ ๋ ์ฝ๋๊ฐ ์ ์ ํ ์๋ตํ ์ ์๋๋ก ํจ์ผ๋ก์จ ์ค๋ฅ์ ์์ธ์ ์ดํดํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ค,
- ๋์คํฌ์์ ํ์ผ์ ์ฝ์ด์ ์ฒ๋ฆฌํ๋์์
์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ '์กด์ฌํ์ง ์๋ ํ์ผ', '์ฝ๊ธฐ ๊ถํ ์์','ํธํ๋๋ ํ์์ด ์๋'๋ฑ ๋ค์
- ์ค๋ฅ์ ์์ธ์ ๋ฐ๋ผ ๋ค์ํ ๋์์ด ํ์ํ ๊ฒฝ์ฐ, ์ค๋ฅ์ ์ ๋ณด๋ฅผ ์ ํํ ์ ๋ฌํจ์ผ๋ก ์จ ์ค๋ฅ๋ฅผ ๋ณต๊ตฌํ๋๋ฐ ๋์์ ์ค ์ ์์
- Swift 2.0์ดํ๋ถํฐ๋ error handling ๋์
: throwing function
- ๋งค๊ฐ๋ณ์ ๊ดํธ ๋ค์์ throws๋ผ๋ ํค์๋๊ฐ ์๋ ํจ์๋ ๊ทธ๋ฅ ์ฌ์ฉํ ์ ์๊ณ error handing ํด์ผํจ //์ํ๋ฉด ์๋ฌ๋จ
- func can() throws
- func canTrowErrors() throws -> String
- error handing์ ํด์ผํ๋ ํจ์
- func cannotThrowErrors() -> String
- error handingํ ์ ์๋ ํจ์
- ํจ์์์ ์ด๋ฐ์์ผ๋ก ์ฌ์ฉ๋จ
: dotrycatch
do {
audioPlayer = try AVAudioPlayer(contentsOf: audioFile)
} catch let error as NSError {
print("Error-initPlay : \(error)")
}
- AVAudioPlayer(contentsOf: audioFile)์ init๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ฐ throws๊ฐ ๋ฌ๋ฆฐ ๊ฒฝ์ฐ ์๋ฌ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผํจ.
- do ๋ก ๋ฌถ์ด์ค๋ค์ ํจ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ์ฒดํฌํ๊ธฐ์ํด try ์ ๋ ฅ
- catch๋ธ๋ฝ์ ์๋ฌ์ ์ด๋ค ์๋ฌ๊ฐ ๋ฌ๋์ง ํ๋ฆฐํธ
AVAudioPlayer(contentsOf: audioFile)
=> ์ด๋ ๊ฒ ํธ์ถํ ์ ๋ ์์ - do ~ try ~ catch๋ก error handigํด์ผํจ
- ํ์ง ์์ผ๋ฉด Call can throw, but it is not marked with 'try' and the error is not handled ์ค๋ฅ ๋ฐ์
do~try catch๋ฅผ ์ด์ฉํ error handling
do {
try ์ค๋ฅ๋ฐ์์ฝ๋
์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์คํํ ์ฝ๋
} catch ์ค๋ฅํจํด1 {
์ฒ๋ฆฌ์ฝ๋
} catch ์ค๋ฅํจํด2 wherw ์กฐ๊ฑด {
์ฒ๋ฆฌ์ฝ๋
} catch {
์ฒ๋ฆฌ์ฝ๋
}
- swift 5 ๋ถํฐ ๋ฑ์ฅ
//1.์๋ฌ์ ์
enum APIError2 : Error {
case aError
case bError
case cError
}
func plusFunction() -> Result<Int, APIError2> { //์ ์์ ์ธ ๊ฒฝ์ฐ์ Int, ์๋ฌ์ธ ๊ฒฝ์ฐ Error
if true {
return Result.success(10) //์ฑ๊ณต์ผ์ด์ค
}
if true {
return Result.failure(APIError2.bError) //์๋ฌ์ผ์ด์ค
}
}
plusFunction()
- Result<Int, APIError2> ๋ ์ ๋ค๋ฆญ ํ์์ด๋ค. ์ ๋ค๋ฆญ์ ์ด ์ด์ ๋ ๋ชจ๋ ์๋ฃํ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด๋ค. ์ฑ๊ณต์ผ์ด์ค๊ฐ Int์ด๋ , ์๋ฌ์ผ์ด์ค๊ฐ ์๋ฌํ์ ์ ์ด๊ฑฐํ์ด๋ ํ ํจ์๋ก ๋ฌถ์ ์ ์๊ฒ ๋๋ค.
- ์คํํ, ๊ฒฐ๋ก ์ ์ผ๋ก plusFunction() ์ Resultํ์ ์ด ๋์ด, ์ฐ์ do-catch, try ์ธ ํ์๊ฐ ์๊ฒ ๋๋ค. Result์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ do catch, try ๋ฅผ ์ฐ์ง ์์๋ ๋๋ ์ . ์ฝ๋ ๊ธธ์ด!
: <>
- https://developer.apple.com/videos/play/wwdc2018/406/
- https://docs.swift.org/swift-book/LanguageGuide/Generics.html
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
- ์ด๋ค ์๋ฃํ์ ์ค์ ๋ก ๊ฐ์ง๊ณ ๋๋ ์๋ฃํ์ ๊ฒฐ์ ํ๊ฒ ๋ค. ๊ฐ์ง๊ณ ๋๋ ํ์ผ๋ก ๊ฐ์ง๊ณ ๋๊ฒ ๋ค.
๊ธฐ๋ฅ์ ๊ฐ๊ณ ๋งค๊ฐ๋ณ์ํ๋ง ๋ค๋ฅธ ํจ์
//๊ฐ์ ์๋ก ๋ณ๊ฒฝํ๋ ์ธํฐ์ ํจ์
func swapInt(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapInt(&x,&y)
print(x,y) //10 20
//๊ฐ์ ์๋ก ๋ณ๊ฒฝํ๋ ๋๋ธํ ํจ์
func swapDouble(_ a: inout Double, _ b: inout Double){
let temp = a
a = b
b = temp
}
var xd = 10.3
var yd = 20.7
swapDouble(&xd, &yd)
print(xd, yd) // 20.7 10.3
//๊ฐ์ ์๋ก ๋ณ๊ฒฝํ๋ ์คํธ๋ง ํจ์
func swapSting(_ a: inout String, _ b: inout String){
let temp = a
a = b
b = temp
}
var xs = "Hi"
var ys = "Hello"
swapSting(&xs, &ys)
print(xs, ys) // Hello Hi
- ๋ฌธ์ : ๋์ผํ ๊ธฐ๋ฅ์์๋ ๋ฌถ์ง ๋ชปํ๊ณ ํ์ ๋ง๋ค ๋๋ ์ ์!! ==> ์ฝ๋์ค๋ณต, ๋ฒ๊ฑฐ๋ก์
์ ๋ค๋ฆญ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด
func swapAny<T>(_ a: inout T, _ b: inout T){
let temp = a
a = b
b = temp
} //T๋ ํ์
์ด๋ฆ
var x = 10
var y = 20
swapAny(&x,&y)
print(x,y)
var xd = 10.3
var yd = 20.7
swapAny(&xd, &yd)
print(xd, yd)
var xs = "Hi"
var ys = "Hello"
swapAny(&xs, &ys)
print(xs, ys)
/*
20 10
20.7 10.3
Hello Hi
*/
- ๊ฒฐ์ ๋์ง ์์ ์๋ฃํ
- ์ด๋ค ์๋ฃํ์ ๋๊ธฐ๋๋์ ๋ฐ๋ผ์ ํจ์๋ก ์ฐ์ด๋ผ ์์์
- ํธ์ถํ ๋ ๊ฒฐ์ ํ๊ฒ ๋ค
Intํ์คํ ๊ตฌ์กฐ์ฒด
struct IntStack {
var items = [Int]()
mutating func push(_ item : Int) {
return items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
}
//๊ตฌ์กฐ์ฒด๋ valueํ์
์ด๋ผ ๋ฉ์๋ ์์์ ํ๋กํผํฐ ๊ฐ ๋ณ๊ฒฝ๋ถ๊ฐ
//mutating ํค์๋๋ฅผ ์ฐ๋ฉด ๋ณ๊ฒฝ๊ฐ๋ฅ
var stackOfInt = IntStack()
print(stackOfInt.items) //[]
stackOfInt.push(1)
print(stackOfInt.items) // [1]
stackOfInt.push(2)
print(stackOfInt.items) // [1, 2]
stackOfInt.push(3)
print(stackOfInt.items) // [1,2,3]
print(stackOfInt.pop()) //3
print(stackOfInt.items) // [1,2]
print(stackOfInt.pop()) //2
print(stackOfInt.items) // [1]
...
- ํ์ง๋ง ์์ ๋ฐฉ๋ฒ์ Int๋ง ๊ฐ์ ธ์ฌ ์ ์๊ณ Double์ด๋ float์ ๊ฐ์ ธ์ฌ ์ ์์
์ผ๋ฐ ๊ตฌ์กฐ์ฒด vs generic๊ตฌ์กฐ์ฒด
//์ผ๋ฐ ๊ตฌ์กฐ์ฒด
struct IntStack {
var items = [Int]()
mutating func push(_ item: Int) {
return items.append(item)
}
mutating func pop() -> Int {
return items.removeLast()
}
}
//generic๊ตฌ์กฐ์ฒด
struct Stack<T>{
var items = [T]()
mutating func push(_ item: T) {
return items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var stackOfInt = Stack<Int>() //์ด๋ฐ์ => ๊ฒฐ์ ๋์ง ์์ ์๋ฃํ
print(stackOfInt.items) //[]
stackOfInt.push(1)
print(stackOfInt.items) // [1]
stackOfInt.push(2)
print(stackOfInt.items) // [1, 2]
stackOfInt.push(3)
print(stackOfInt.items) // [1,2,3]
print(stackOfInt.pop()) //3
print(stackOfInt.items) // [1,2]
print(stackOfInt.pop()) //2
print(stackOfInt.items) // [1]
var stackOfString = Stack<String>() //์ด๋ฐ์ => ๊ฒฐ์ ๋์ง ์์ ์๋ฃํ
stackOfString.push("์ผ")
print(stackOfString.items) // ["์ผ"]
stackOfString.push("์ด")
print(stackOfString.items) // ["์ผ","์ด"]
stackOfString.pop()
print(stackOfString.items) // ["์ผ"]
- ์ด๋ ๊ฒ ๋ค์ํ ํ์ ์ ๊ฐ์ง๊ณ push, pop ํจ์๋ฅผ ๊ฐ์ง๊ณ ๋ ์ ์๊ฒ ๋จ.
Swift์ ๋ฐฐ์ด๋ genaric๊ตฌ์กฐ์ฒด
-
var x : [Int] = [] //๋น๋ฐฐ์ด
-
var y = Int
-
var z : Array = []
-
var a : [Int] = [1,2,3,4]
-
var b : Array : [1,2,3,4]
-
var c : Attay = [1.2, 2.3, 3.5, 4.1]
-
@frozen struct Array
-
@frozen์ ์ ์ฅํ๋กํผํฐ ์ถ๊ฐ, ์ญ์ ๋ถ๊ฐ
- ์ฌ์ ์ ์๋ฏธ : ๋ํ์(๋ช ์ฌ), ์์ํ๋ค(๋์ฌ)
- Delegation is design pattern that enable a class or structe to hand off (or delegate) some of its responsibilities to an instance of another type.
- This design pattern is implemented by defining a protocol that encapsulates the delegated responsivilities, such that a conforming type(know as a delegate) is guaranteed to provide the functionality that has been delegated.
- Delegation can be used to respond to a particular action, or to retrieve data from an external source without needing to know the underlying type of that source.
- Delegation(์์)์ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๊ฐ **์ผ๋ถ ์ฑ ์์ ๋ค๋ฅธ ์ ํ์ ์ธ์คํด์ค๋ก ์ ๋ฌ(๋๋ ์์)**ํ ์ ์๋๋ก ํ๋ ๋์์ธ ํจํด์ด๋ค.
- ์์๋ ๊ธฐ๋ฅ์ ํ๋กํ ์ฝ์์ ์ ์ํ๋ฉฐ, delegate๊ฐ ์์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
- ์์์ ํน์ ์์ ์ ์๋ตํ๊ฑฐ๋์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค. //์ผ๋ถ ์ฑ ์์ ๋ธ๋ฆฌ๊ฒ์ดํธ์๊ฒ ๋๊ธด๋ค.
- ๋๋ฆฌ์, ์กฐ๋ ฅ์
- ์ด๋ฐ ์ผ์ด ์์ ๋ delegate๋๊ฐ ์ข ์ ๋ดํด์ค
- delegate๋ก ์ ์ธ๋ (๋ณดํต ๋ด๊ฐ ๋ง๋ ํด๋์ค์) ๊ฐ์ฒด๋ ์์ ์ ์๋ช ํ ๊ฐ์ฒด(ํ ์ด๋ธ๋ทฐ, ํผ์ปค๋ทฐ๋ฑ)๊ฐ ์ผ์ ๋์๋ฌ๋ผ๊ณ ํ๋ฉด ์ง์ ๋ ๋ฉ์๋๋ฅผ ํตํ์ฌ ์ฒ๋ฆฌํด์ค
- ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด
- ํ๋์ ๊ฐ์ฒด๊ฐ ๋ชจ๋ ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ์ฒ๋ฆฌํด์ผํ ์ผ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋๊ธฐ๋ ๊ฒ
- ๋ณดํต ํ๋กํ ์ฝ์ ์ฌ์ฉ (๋ธ๋ฆฌ๊ฒ์ดํธ์ ํ๋กํ ์ฝ ๋์ ์๋ ๊ด๊ณ)
protocol์ ์,์ฑํ, ์ค์
protocol Runnable {
var x : Int { get set }
func run()
}
// ๋๋ฆฌํ๊ณ ์ถ์ ํจ์ ๋ชฉ๋ก ์์ฑ
//์ฝ๊ธฐ ์ฐ๊ธฐ๊ธฐ๋ฅ ํ๋กํผํฐ
// ๋ฉ์๋๋ ์ ์ธ๋ง ์์
class Man : Runnable { //์ฑํ, adopt
var x : Int = 1 //์ค์, conform
func run() { print("๋ฌ๋ฆฐ๋ค~~") }//์ค์, conform
}
class Man์ x, run()์ ์ ์๋ค๋ฉด
- type 'Man' doed not conform to protocol 'Runnable'
1. protocol ์ฑํ(adopt)
- ViewController ํด๋์ค๋ ๋ถ๋ชจ UIViewController๋ฅผ ์์๋ฐ๊ณ , UIPickerViewํ์ ์ธ์คํด์ค PickerImage๋ฅผ ์ ์ธ
class ViewController : UIViewController {
@IBOutlet var pickerImage: UIPickerView! //!๋ก ๋ง๋ค์ด์ผํจ. ์ด๊น๊ฐ์์ด์ผํ๋๊น
}
- ํผ์ปค๋ทฐ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ๋กํ ์ฝ UIPickerViewDelegate์ UIPickerViewDataSource๋ฅผ ์ฑํ
class ViewController : UIViewController, UIPikerViewDelegate, UIPickerViewDataSource {
}
- ํ๋กํ ์ฝ UIPickerViewDelegate์ UIPickerViewDataSource์ ํ์ ๋ฉ์๋๋ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋กํ ์ฝ์ ์ค์(conform)
2.protocol ์ฑํ(adopt)ํ๊ณ ์์
pickerView(_:rowHeightDorComponent:)
- optional func ==> ํ๋กํ ์ฝ์ ๋ฉ์๋๋ค์ ๋ค๊ฐ ํ์ํ๊ฑฐ ์์์ ๊ตฌํํด!
numberOfComponents(in:)
- Required ==> ํค์๋๊ฐ ๋ถ์ ๋ฉ์๋๋ค์ ๋ฐ๋์ ๊ตฌํํด! (ํ์์ฌํญ)
UIPikerViewDelegate
- UIPikerView์ ๋ํ ํ๋กํ ์ฝ
- ๋๋ protocol์ด์ผ. ๋ ๋์์ค ์กฐ๋ ฅ์์ผ. ํผ์ปค์ฅฌ์ผ, ๋ ํผ์ ๋ง์ ์ผํ๊ธฐ ๋ฐ์์ง? ๋ด ์์ ํผ์ปค๋ทฐ ๋์๊ฒ ์ด๋ค ์ผ์ด ์ผ์ด๋ฌ์ ๋ ํ๊ณ ์ถ์ ์ผใ
๋ค์ด ๋ฉ์๋ ๋ชฉ๋ก(์ ์ธ)์ด ๋์ด ์์ด. ํผ์ปค๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ํด๋์ค์์๋ ์ฐ์ ๋(ํผ์ปค๋ทฐ ๋ธ๋ฆฌ๊ฒ์ดํธ)๋ฅผ ์ฑํํด. ์ฑํํ ํด๋์ค์์๋ ์์ ์ด ๋ธ๋ฆฌ๊ฒ์ดํธ๋ผ ์ง์ ํ๋ ๊ฒ ์ผ์ง ๋ง๊ณ
pikerimage.delegate = self
- ๊ตฌํํ ๊ธฐ๋ฅ์ iOSํ๋ ์์ํฌ ๋ด๋ถ์ ์ผ๋ก ์ํ๋ ์์ ์ ํผ์ปค๋ทฐ๊ฐ ํธ์ถ(callback)ํด
- ๊ทธ ์์ ์ ํ๊ณ ์ถ์ ์ผ๋ง ๋ฉ์๋ ๋ด๋ถ์ ๊ตฌํํด
UIPickerViewDataSource์ ํ์ ๋ฉ์๋๋ ๋ฐ๋์ ๊ตฌํํด์ผ ํจ
func numberOfComponents(in pickerView : UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return Array.count
}
- ~DataSource๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ทฐ๋ฅผ ๊ทธ๋ ค์ฃผ๋ ์ญํ
- ํผ์ปค๋ทฐ ์ฌ์ฉํ๋ ํด๋์ค(ViewController)
- ํผ์ปค๋ทฐ ๋ธ๋ฆฌ๊ฒ์ดํธ ํ๋กํ ์ฝ : ์ด๋ค ํ๋์ ๋ํ ๋ฐ์ ๋์ ๋ฉ์๋ ๋ชฉ๋ก (์ฑํํ๋๋ผ๋ ๋ฐ๋์ ๊ตฌํํ ํ์๋ ์์)
- ํผ์ปค๋ทฐ ๋ฐ์ดํฐ์์ค ํ๋กํ ์ฝ : ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํผ์ปค๋ทฐ๋ฅผ ๊ทธ๋ ค์ฃผ๋ ๋ฉ์๋ ๋ชฉ๋ก (์ฑํํ๋ฉด ๋ฐ๋์ ๊ตฌํํด์ผํจ)
- ํ์ ๋ฉ์๋ 2๊ฐ
// Retrurn the number of rows for the table
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
// Provide a cell object for each row
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IntdexPath) -> UITableViewCell {
//Fetch a cell of the approriate type
cell.textLabel!.text = "Cell text"
return cell
}
override func tableView(in tableView: UITableView) -> Int {
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
- header, footerview๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌ / ํ , header, footer ๋์ด ์ง์
- ์ค๋ฌด์คํ ์คํฌ๋กค๋ง์ ์ํด ๋์ด ์ถ์ ์น ์ ๊ณต
- ํ ์ ํ์ ํ๊ณ ์ถ์ ์์
- ์ค์์ดํ์ ์์
- ํ ์ด๋ธ ๋ด์ฉ ํธ์ง ์ง์
//์ง์ ๋ ํ์ ์ ํํ๋ ค๊ณ ๋๋ฆฌ์ธ์๊ฒ ์๋ฆผ
func tableView(UITableView, willDelectRowAt: IndexPath) -> IndexPath?
//์ง์ ๋ ํ์ด ์ด์ ์ ํ๋์์์ ๋๋ฆฌ์ธ์๊ฒ ์๋ฆผ
func tableView(UITableView, didSelecRowAt: IndexPath)
//์ง์ ๋ ํ์ ์ ํ ํด์ ํ๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ๋๋ฆฌ์ธ์๊ฒ ์๋ฆผ
func tableView(UITableView, wilDeselectRowAt: IndexPath)-> IndexPath?
//์ง์ ๋ ํ์ด ์ ํ ํด์ ๋์์์ ๋๋ฆฌ๊ฒ์ดํธ์๊ฒ ์๋ฆผ
func tableView(UITableView, didDeselectRowAt: IndexPath)
UIViewControllerdhk UITableViewController
- UITableViewํด๋์ค๋ฅผ ์์๋ฐ๋๋ค๋ฉด ?
class ViewController : UITableViewController {
}
- //UITableViewDelagate,UITableViewDataSource
- ํ๋กํ ์ฝ์ด ์ ์ํ ๋ฉ์๋๋ค๋ ์๋์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ ๋๊ฑฐ๋ ์ฃผ์์ฒ๋ฆฌ๋์ ๋ง๋ค์ด์ง
- ํ ์ด๋ธ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋์ ๋๋ ๋น์ทํ ๋์์ ์ถ๊ตฌํ๊ธฐ ๋๋ฌธ์Xcode์์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์๋๋ ํจ์๋ฅผ ์ฃผ์์ฒ๋ฆฌํ์ฌ ์ ๊ณตํจ. ๋ง๋ถ์ด๋ฉด ๋ทฐ ์ปจํธ๋กค๋ฌ์์๋ ๋๋ฌด ๋ค์ํ ๋์์ ํ๋ฏ๋ก ์ฃผ์์ฒ๋ฆฌํ ํจ์๋ ์ ๊ณตํ์ง์๊ณ ๋ช๋ช ํน์ ์ปจํธ๋กค๋ฌ์์๋ง ์ ๊ณต๋จ.
class ViewController : UIViewController, UITableViewDelagate,UITableViewDataSource {
}
mutable(๋ฎคํฐ๋ธ)
- ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ฒด
- ์ต์ด์์ฑ ์ดํ์ ์์ ๋กญ๊ฒ ๊ฐ์ ๋ณ๊ฒฝ, ์ถ๊ฐ, ์ญ์ ๋ฑ์ด ๊ฐ๋ฅ
- ์์) int, float, list, ์ฌ์ฉ์ ์ ์ ํด๋์ค
immutable(์ด๋ฎคํฐ๋ธ)
- ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด
- ์ต์ด ์์ฑ ์ดํ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค
- ์์) tuple, string, dictionary - key
- ์ด ์ธ์ ๋ด์ฅ ํ์ ์ธ ์ซ์, ๋ถ๋ฆฌ์ธ ๋ฑ์ด ํฌํจ๋จ.
Swift์์ Sting์ mutable์ธ๊ฐ immutable์ธ๊ฐ?
- Objective-c์์๋ String์ด Class์๊ณ , Swift์ String์ Struct(๊ตฌ์กฐ์ฒด)์. class ๊ธฐ๋ฐ์ธ Objective-c์์๋ NSString, NSMutableString์ฒ๋ผ ์ ์ด์ mutable๊ณผ immutable์ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ์ง๋ง, Swift์์๋ ๊ตฌ์กฐ์ฒด ๊ธฐ๋ฐ์ผ๋ก Struct๋ value-type์ด๋ค. ๋ฐ๋ผ์, Int์ ๊ฐ์ value์ ๋์ผํ๊ฒ ๋์ํจ.
- ์์ ์ด์ ๋ก swift๋ value-type์ ๊ฐ์ฒด๋ฅผ let์ด ์๋ var๋ก ์ ์ธํ ๊ฒฝ์ฐ mutableํจ์๋ฅผ ํตํด ๊ฐ์ ์ ๋ฐ์ดํธ ํ ์ ์์ผ๋ฏ๋ก mutable์ด๊ณ , let์ immutable์ธ ์ .
- ๊ฒ๋ณด๊ธฐ์, struct๋ด๋ถ์ value๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ๋ด๋ถ์ ์ผ๋ก๋ ๋ฐ๊พธ๋ ค๋ value๋ฅผ ๊ฐ์ง๊ณ ์๋ value-type(struct)๋ฅผ ์ฌ์ ํ ํ๋ ๊ฒ์ด๋ค.
swift์ ๊ฐ์ฒด๋ ์ฌ์ฉํ๊ธฐ ์ ๋ชจ๋ ์ ์ฅ ํ๋กํผํฐ์ ๋ํด ์ด๊ธฐํ ํ์
- ์ด๊ธฐ๊ฐ ์ง์
- ์ต์ ๋ ํ์ - nil๊ฐ์ผ๋ก ์ด๊ธฐํ
- ์ด๊ธฐ๊ฐ์ด ์๊ณ , ์ต์ ๋ ํ์ ์ด ์๋ ํ๋กํผํฐ์ ๋ํด์๋ ์ด๊ธฐํ ๋ฉ์๋์์ ์ค์
- https://docs.swift.org/swift-book/LanguageGuide/Initialization.html
designated initializers and convenience initializers
- Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain
- Designated initializers๋ ์ฐ์ ์ ์ธ ์ด๋์ ๋ผ์ด์ ๋ค, ํ๋กํผํฐ๋ฅผ ๋ชจ๋ ์ด๊ธฐํ ํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ์ด๋์ ๋ผ์ด์ .
- Every class must have at least one designated initializer. In some cases, this requirement is satisfied by inheriting one or more designated initializers form a superclass, as described in Automaic initiailzer
- ๋ชจ๋ ํ๋์ Designated initializers๋ฅผ ๊ฐ์ ธ์ผํ๋ค. ๋ฌผ๋ก ์ด๊ธฐํ๊ฐ ๋ค ๋์ด์์ผ๋ฉด ํ์์์.
- Convaenience initalizers ares secondaty, supporting initializers for a class. You cas define a convenience initinalizer to call a designated initializer from the same class as the convenience initializer with some of the desinated initializer's parameters set to degauly values.You can also define a convenience initializer to creat an instance of that class for that class for a spectific use case or input vlaue type.
- Convaenience initalizers๋ ์์ด๋ ๋๊ณ ์์ด๋ ๋๊ณ . ์ด๋์ ๋ผ์ด์ฆ๋ฅผ ์ํฌํ ํ๋ ์ ๋.
- You do not have to probide convenience initializers if yout class does not require them. Create convenience initalizers whenever a shorcut to a common initialization pattern will save time or make initailzation of the class clearer in intent.
ํด๋์ค์ ํ๋กํผํฐ๋ ์ด๊ธฐ๊ฐ์ด ์๊ฑฐ๋ ์ต์ ๋ ๋ณ์(์์)๋ก ์ ์ธ
class Man {
var age : Int = 1
var weight : Double = 3.5
}
calss Man {
var age : Int?
var weight : Doble!
}
์ธ์คํด์ค ์์ฑ๋ถ๊ฐ(์ด๊ธฐ๊ฐ ์์)
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
}
var kim : Man = Man() //์๋ฌ๋จ : ์ด๋์
๋ผ์ด์ ๋ง๋ค์์ด์ผ์ง.
kim.display()
์ธ์คํด์ค ์ด๊ธฐํํ๊ธฐ: init()
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(){ //func๋ฅผ ์ฐ์ง์๊ณ init์ ์ด๋ค.
age = 1
weight = 3.5
}
}
var kim : Man = Man() //์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด์, init ์๋ํธ์ถ๋จ.
kim.display()
: ์ง์ ์์ฑ์ ๋ชจ๋ ํ๋กํผํฐ(๊ฐ์ฒด)๋ฅผ ์ด๊ธฐํ ์ํค๋ ์์ฑ์
- ํด๋์ค์ ๋ฐ๋์ 1๊ฐ์ด์ ํ์
- ๋จ๋ ์ผ๋ก ์ด๊ธฐํ ๊ฐ๋ฅ
- (๋ชจ๋ ์ด๊ธฐํ๊ฐ์ ๋๋ธ๋ค)
- ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ(enum)์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์์ ์์ ํด์ผํ ์ด๊ธฐํ์์
- ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง๋ฉด์ ์๋ํธ์ถ๋จ
- init ๋ฉ์๋(์์ฑ์)
init(){ //์ด๊ฒ designated initializer
age = 1
weight = 3.5
}
- designated initializer
- ๋ชจ๋ ํ๋กํผํฐ(age, weight)๋ฅผ ๋ค ์ด๊ธฐํ์ํค๋ ์์ฑ์
- ์ด๊ธฐํ๋์ง ์์ ํ๋กํผํฐ๊ฐ ์์ ๊ฒฝ์ฐ ํด๋์ค์ ๋ฐ๋์ 1๊ฐ ์ด์ ํ์
- ์ฃผ์: ์ด๊ธฐํ๊ฐ ๋๋๊ธฐ ์ ์ ๋ค๋ฅธ ๋ฉ์๋ ํธ์ถ์ ๋ถ๊ฐ๋ฅ
- ์๋ฉธ์
- ์ธ์คํด์ค๊ฐ ์ฌ๋ผ์ง ๋ ์๋ ํธ์ถ
- deinit{ }
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(yourAge: Int, yourWeight: Double){
age = yourAge
weight = yourWeight
} // designated initializer
}
//var kim : Man = Man() //์ค๋ฅ
var kim : Man = Man(yourAge: 10, yourWeight: 20.5)
kim.display()
designated initializer์ self
- ํ์ฌ ํด๋์ค ๋ด ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ๊ฐ๋ฆฌํฌ ๋ ๋ฉ์๋๋ ํ๋กํผํฐ ์์ self.์ ๋ถ์
- ์์ ์์ค์์๋ ๊ตฌ๋ถ๋์ด self ์๋ตํด๋๋จ.
- ์๋ ์์ค์์๋ ๋งค๊ฐ๋ณ์๊ณผ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ฐ๋์ ์จ์ผํจ.
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
} // designated initializer
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
- designated initializer๋ ๊ตฌ์กฐ์ฒด์์๋ ์๋์ ์ผ๋ก ๋ง๋ค์ด์ง :) ==> ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์
์๋ชป๋ ์ด๋์ ๋ผ์ด์
- ํ๋กํผํฐ ํ๋๋ฅผ ์ ์ธํ๋ฉด error : return form initalizer without initalizinh all stored propertyes. 'self.age' not initialized
- ๋ฐ๋์ ๋น ๋จ๋ฆฌ์ง ์๊ณ ๋ชจ๋ ์ด๊ธฐํํด์ผํจ
init() overloading
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(){ // 1.designated initializer
age = 1
weight = 3.5
}
init(age: Int, weight: Double) { //2.designated initializer
self.age = age
self.weight = weight
}
}
var kim : Man = Man() //1
kim.display()
var lee : Man = Man(age: 10, weight: 20.5) //2
lee.display()
:ํธ์์์ฑ์ ์ผ๋ถ๋ง ์ฒ๋ฆฌํ ๋ค ๋ค๋ฅธ ์์ฑ์์๊ฒ ๋๋จธ์ง ๋ถ๋ถ ์์
- ๋ณด์กฐ ์ด๋์ ๋ผ์ด์
- ์ผ๋ถ ํ๋กํผํฐ๋ง ์ด๊ธฐํ(๋จ๋ ์ผ๋ก ์ด๊ธฐํ ๋ถ๊ฐ๋ฅ)
- ๋ค๋ฅธ ์ด๋์
๋ผ์ด์ ๋ฅผ ์ด์ฉํด์ ์ด๊ธฐํ(initalizer delegation)
- self.init()
- ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฒด ๋ง๋ค ์ ์๋๋ก ํธ์๋ฅผ ์ ๊ณตํ๋ ค๋ฉด init๋ฅผ ์ค๋ฒ๋ก๋ฉ ํด์ผํ๊ณ ์ฝ๋ ์ค๋ณต์ด ๋ฐ์
- ์ฝ๋ ์ค๋ณต ๋ฐฉ์ง
- ๋จ๋ ์ผ๋ก ๋ชจ๋ ์ด๊ธฐํ ๋ถ๊ฐ
- ์ด๊ธฐํ๊ฐ ๋๋์ผ๋ง ์ ๊ทผ๊ฐ๋ฅ(designated initialize์ธ self.init() )์๋์ ์์ฑ
- (๋ชจ๋ ์ด๊ธฐํ๊ฐ์ ๋๋ด์ง๋ ์์. ํ์ง๋ง ์ต์ข ์ ์ผ๋ก designated์ ์ ๊ทผ(ํ๋กํผํฐ ๋ถ๋ฌ์)ํ์ฌ ๋ง๋ฌด๋ฆฌ์ง์.)
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
}
convenience init(age: Int) {
self.init(age: age, weight: 3.5)
}//convenience
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
var lee : Man = Man(age : 1)
lee.display()
//๋์ด = 10, ๋ชธ๋ฌด๊ฒ = 20.5
//๋์ด = 1, ๋ชธ๋ฌด๊ฒ = 3.5
์ฌ๋ฌ๊ฐ์ convenience initializer
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
//designated
init(age: Int, weight: Double){ //1. ๋งค๊ฐ๋ณ์ 2๊ฐ
self.age = age
self.weight = weight
}
//convenience
convenience init(age: Int) { //2. ๋งค๊ฐ๋ณ์ 1๊ฐ
self.init(age: age, weight: 3.5)
}
convenience init(){ //3. ๋งค๊ฐ๋ณ์ 0๊ฐ
self.init(age:20, weight: 60.5)
}
}
var kim : Man = Man(age: 10, weight: 20.5) //1
kim.display()
var lee : Man = Man(age : 1) //2
lee.display()
var han : Man = Man() //3
han.display()
//๋์ด = 10, ๋ชธ๋ฌด๊ฒ = 20.5 //1
//๋์ด = 1, ๋ชธ๋ฌด๊ฒ = 3.5 //2
//๋์ด = 20, ๋ชธ๋ฌด๊ฒ = 60.5 //3
์์์ฃผ์
convenience init(age:Int) { //3
self.init() // initailzer delegation
self.age = age // ์์ ์ ์ด๊ธฐํ ์ฝ๋
}
/*
convenience init(๋งค๊ฐ๋ณ์){
//์ด๊ธฐํ ์์, slef. init()
//์์ ์ ์ด๊ธฐํ ์ฝ๋
}
*/
convenience init -> designated init -> overwrite
convenience init(xPosition: Int){
self.init() <- initํธ์ถ.
self.xPosition = xPosition <- ๋จ๋
์ฒ๋ฆฌํ ๊ฒ ํธ์ถ
}
convenience init -> designated init
convenience init(width: Int, height: Int, cornerRedius: Int){
self.init(width: width, height: height, xPosition:10, yPosition:30, cornerRadius: conrnerRedius) -> designated initializer๋ฅผ ๋ถ๋ฅผ ๋ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์์.
}
convenience init -> convenience init
convenience init(cornerRadius: Int){
self.init(width: 20, height: 20, cornerRadius: cornerRadius)
}
- ์ด๊ธฐํ ๊ณผ์ ์ (convenience -> convenience -> ... -> designated (์ต์ข ) ์์๋ก ๋์. designated -> designated๋ ํธ์ถ๋ถ๊ฐ)
: ์คํจ๊ฐ๋ฅํ ์์ฑ์:init? init!
- init๋ค์์ "?"๋ "!"ํ๋ฉฐ ์ต์ ๋์ด ๊ฐ์ด ๋ฆฌํด๋จ
- ์ค๋ฅ ์ํฉ์ nil์ ๋ฆฌํดํ๋ ์กฐ๊ฑด๋ฌธ์ด ์์
- return nil
- init? , init!
- ์ธ์คํด์ค ์์ฑ์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์.
- ์์ฑ์ด ๋๋ฉด ์ต์ ๋ ํ์ ์ ๋ฐํ, ์์ฑ์คํจ์ nil๋ฐํ
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init?(age: Int, weight: Double){
if age <= 0 {
return nil
} else {
self.age = age
}
self.weight = weight
}// failavle initialize
}
var kim : Man = Man(age: 10, weight: 20.5)!
kim.display()
var lee : Man = Man(age: 0, weight: 3.5)! //line23
lee.display()
-
๋์ด = 10, ๋ชธ๋ฌด๊ฒ = 20.5
-
Fatal error: Unexpectedly found nil while unwrapping an Optional value: file __lldb_expr_23/แแ กแแ ฎแแ กแแ ฎ.playground, line 23
-
Playground execution failed:
-
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
-
The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.
failable initialize๊ฐ ์๋ ํด๋์ค์ ์ธ์คํด์ค ์์ฑ
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init?(age: Int, weight: Double){
if age <= 0 {
return nil
} else {
self.age = age
}
self.weight = weight
}// failavle initialize
}
var kim : Man? = Man(age: 1, weight: 3.5)
//1-1.์ต์
๋ ํ์ผ๋ก ์ ์ธ
if let kim1 = kim { //1-2.์ต์
๋ ๋ฐ์ธ๋ฉ
kim1.display()
}
//2.์ธ์คํด์ค ์์ฑ๊ณผ ๋์์ ์ต์
๋ ๋ฐ์ธ๋ฉ
if let kim2 = Man(age:2, weight: 5.5) {
kim2.display()
}
//3.์ธ์คํด์ค ์์ฑํ๋ฉด์ ๋ฐ๋ก ๊ฐ์ ์ธ๋ํ
var kim3: Man = Man(age: 0, weight: 7.5)!
kim3.display() // ==> crach
//4.์ต์
๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ์ ๊ฐ์ ์ธ๋ํ
var kim4 : Man? = Man(age: 4, weight: 10.5)
kim4!.display()
-
- ์ต์ ๋ ๋ฐ์ธ๋ฉ ํ์ฌ ์ฒ๋ฆฌ (์ ์ผ์ข์ ๋ฐฉ๋ฒ)
-
- ์ ์ธํ์ง ์๊ณ ๋ฐ๋ก ๋์ ํ์ฌ ํ๋ฆฌ๊ฒ. (1.์ ์ถ์ฝ)
-
- !์ฌ์ฉ - ๊ฐ์ ์ธ๋ํ
-
- kim4๋ฅผ !๋ก - ๊ฐ์ ์ธ๋ํ
crash์ ๋ฐ์ํ๋ ์ค๋ฅ์ .soํ์ผ
- .so๋ .dylib //์์ค์ค, ๋ค์ด๋๋ฏน ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- shared object
- shared library
- ์๋์ฐ์ dll
- ๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(ํ๋ก๊ทธ๋จ ์คํ์ ํ์ํ ๊ฒ๋ค์ ์ฐ๊ฒฐ)
- .a
- archive library
- ์ ์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ปดํ์ผ ์ ํฌํจ๋จ
failable initializer(์คํจ ๊ฐ๋ฅํ ์์ฑ์ :init?)
- https://developer.apple.com/documentation/uikit/uiimage/1624146-init
- let myImage: UIImage(?) = UIImage(name: "apple.png")!
- ํ์ ์ ?๋ฃ๊ฑฐ๋ ๋ณ์์ !๋ฃ๊ฑฐ๋
- apple.pngํ์ผ์ด ์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๊ณ nil
- nil๊ฐ๋ ์ ์ฅํ ์ ์์ผ๋ ค๋ฉด init๋ค์์ ์ต์ ๋ "?"๋ฅผ ํ๋ฉฐ ์ต์ ๋ ๊ฐ์ด ๋ฆฌํด๋จ
- init?(name name : String) //fatilable initializers
- init?๋ก ๋ง๋ ์ธ์คํด์ค๋ ์ต์ ๋ํ์ผ๋ก ๋ง๋ค์ด์ ธ์, ์ฌ์ฉํ๋ ค๋ฉด ์ต์ ๋์ ์ธ๋ํ ํด์ผํด์ ์์ ์์ ์์ ์ ์ผ ๋ง์ง๋ง์ด "!"๊ฐ ์์
๋ค๋ฅธ ์์
class Person{
let name: String
let age: Int
init?(name: String, age: Int){
guard age > 0 else {return nil} //์คํจํ๋ฉด nil๋ฐํ
self.name = name //์ฑ๊ณตํ๋ฉด ์ด๊ธฐํ
self.age = age
}
}
//failable initializer
if let person = Person(nmae: "James", age : 20) {
person
} //person
if let person = Person(name: "James", age : -5) {
person
} else {
"Failed"
}//Failed
์์ํด๋์ค์์ ๋ถ๋ชจํด๋์ค๋ฅผ ํธ์ถํ ๋๋ designated๋ฅผ ์จ์ผํจ
- ์๋ธ ํด๋์ค๋ ์๊ธฐ ์์ ์ด์ธ์ ์ํผ ํด๋์ค์ ์ ์ฅ ํ๋กํผํฐ๊น์ง ์ด๊ธฐํ ํด์ผํจ
- ์๋ธ ํด๋์ค๋ ์ํผ ํด๋์ค์ ์ง์ ์์ฑ์(designated initializer) ํธ์ถ ํ์ (convenience๋ ํธ์ถ ๋ถ๊ฐ)
- ์ํผ ํด๋์ค์ ์ง์ ์์ฑ์๊ฐ ๊ธฐ๋ณธ init ํจ์ ํ๋๋ง ์์ ๊ฒฝ์ฐ๋ ๋ณ๋๋ก ์์ฑํ์ง ์์๋ ์๋์ผ๋ก **super.init()**๋ฉ์๋ ํธ์ถ
- ์์ฑ์๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ, ์ด๋ค ์ด๊ธฐํ ๋ฉ์๋๋ฅผ ์ ํํด์ผ ํ ์ง ์ ์ ์์ผ๋ฏ๋ก ์ ํํด์ฃผ์ง ์์ผ๋ฉด ์ค๋ฅ. ์ด ๋๋ ์๋ธ ํด๋์ค์์ ์ํผ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํํด์ฃผ์ด์ผ ํจ. ํธ์ ์์ฑ์(convenience initializer)์๋ ๋ฌด๊ด
class Base {
var someProperty: String
init(){
someProperty = "someProperty"
}
//1-0.designated ์ถ๊ฐ์
//init(_ avlue: String){
//self.someProperty = "someProperty"
}
convenience init(someProperty: String){
self.init()
self.someProperty = someProperty
}
}
class Rectangle : Base { //์์
var width : Int
var heigth : Int
override init()
width = 10
height = 5
//1-1.
//super.init() //์ํผ ํด๋์ค์ ์ง์ ์์ฑ์๊ฐ ๊ธฐ๋ณธ ์์ฑ์ ํ๋๋ง ์์ ๊ฒฝ์ฐ ์๋ ํธ์ถ
//super.init("์์ฑ์ ๋ด์์ ์ํผ ํด๋์ค์ ํธ์ ์์ฑ์ ํธ์ถ ์ ์ค๋ฅ")
init(width: Int, height: Int) {
self.width = width
self.height = height
//1-3.
//super.init() ๋์ค์ ํ๋ ์ ํํ๋ผ๊ณ ์ค๋ฅ๋จ.
}
}
- ์์ํด๋์ค(Rectangle)์๋ designated๊ฐ ์ ๋์ด์์ผ๋, ๋ถ๋ชจํด๋์ค(Base)์ธ someProperty์ ๋ํ designated๊ฐ ์์. ๊ทธ๋ผ์๋ ์ค๋ฅ๋์ง ์๋ ์ด์ ๋? ์ด์ฐจํผ ์์ฑ์๊ฐ 1๊ฐ ์ด๊ธฐ ๋๋ฌธ.. 1๊ฐ ์ธ๊ฒฝ์ฐ super.init() ๊ฐ ์๋ ํธ์ถ๋์ด ํํํ ํ์ ์์. ๋ถ๋ชจํด๋์ค์์ init์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ์์ ์ชฝ์ super.init() ์จ์ค์ผํจ.
override init
- ์์ฑ์๋ ์ผ๋ฐ ํจ์์ฒ๋ผ override์ด์ฉํ์ฌ ๋ฎ์ด ์ธ ์ ์์.
class Human { //๋ถ๋ชจ
var name: String
//1-2.๊ทธ๋ฅ ์ฌ์ฉ์ ์ถฉ๋๊ฐ๋ฅ
init(){
self.name = "ํ๊ธธ๋"
}
init(name : String){
self.name = name
}
}
class Student : Human { //์์ //1-1.Student๊ฐ Human์ ์์๋ฐ๊ณ ์์ผ๋๊น. ๊ทธ๋ฅ init์ฐ๋ฉด ์ ๋ถ๋ชจ์ designated์ ์ถฉ๋ํจ.
var school: String
//1-0.override init ์ฐ๋ ์ด์
override init() {
self.school = "University"
super.init() //๋ ๊ฐ์ ์ง์ ์์ฑ์ ์ค ํ๋ ํธ์ถ
//super.init(name:"์ด์์ ")
}
//๊ฐ๊ฐํ๊ธฐ.
//2-1.์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ
init(school: String){ //school๋ง ๋ฐ์์
self.school = school //์๊ธฐ ์์ ์ ์ด๊ธฐํ ํ๊ณ
super.init() //๋ถ๋ชจ ํด๋์ค๋ฅผ ์ด๊ธฐํ ํ๊ฒ ๋ค.
}
//์ํผ ํด๋์ค์ ์ง์ ์์ฑ์ ์ค๋ฒ๋ผ์ด๋์ ํธ์ ์์ฑ์ ๊ธฐ๋ฅ ๋์ ์ฌ์ฉ ๊ฐ๋ฅ
convenience override init(name:String) { //2-0.๋๊ฐ์ ์ด๋ฆ์ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด์๋ convenience์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ.
self.init(school: "Univ")
self.name = name //2-2.name์ ๋ฎ์ด ์ฐ๊ณ ์๋ ๊ตฌ์กฐ.
//2-3. ๋ง์ด ์ฐ์ด๋ ๊ตฌ์กฐ๋ ์๋ ใ
ใ
..
}
}
let student1 = Student()
let srudent2 = Student(name: "์ฒ ์")
let student3 = Student(school: "higt school")
//๊ฐ์ถ๋ ฅ์
student1.school //University
seudent1.name //ํ๊ธธ๋
- ์๊ธฐ ์์ ๋ถํฐ ์ด๊ธฐํ ํ๋ ๊ฑด ํญ์ ๊ฐ์.
- ์์๋ฐ์์ ๋, ์์ฑ์์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์๋ฅผ ๋ฐ๊ฟ์ฃผ๊ณ ์ถ์๋๋ override๋ฅผ ํด์ค์ผํจ.
init()๋ ์์์ด ๋ ๊น?
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double) {
self.age = age
self.weight = weight
}
}
class Student : Man {
//๋น์ด์์ง๋ง Man์ ๋ชจ๋ ๊ฒ์ ๊ฐ์ง๊ณ ์์
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
var lee : Student = Student(age: 20, weight: 65.2)
lee.display()
print(lee.age)
//์ ์คํ๋๋ ๊ฒ์ผ๋ก ๋ณด์ init๋ ์์์ด ๋๋ค ?
initalizer๊ฐ ์์๋๋ ๊ฒฝ์ฐ
- designated initializer์ convenience initializer ๋ชจ๋ ์์
- ์์ ํด๋์ค์ designated initializer๊ฐ ์๋ ๊ฒฝ์ฐ
- ์์ ํด๋์ค์ ์ด๊ธฐํ๊ฐ ํ์ํ ํ๋กํผํฐ๊ฐ ์์ ๊ฒฝ์ฐ
- convenience initializer๋ง ์์๋๋ ๊ฒฝ์ฐ
- ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ designated initializer๋ฅผ overrideํ๋ ๊ฒฝ์ฐ
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double) {
self.age = age
self.weight = weight
}
convenience init(age: Int){
self.init(age:age, weight: 3.5)
}
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
var lee : Man = Man(age: 1)
lee.display()
class Student : Man {
//๋น์ด์๋ค
}
var kim1: Student = Student(age: 20, weight: 65.5)
kim1.display()
var lee1: Student = Student(age: 2)
lee1.display()
//์์ ํด๋์ค(Student)์ designated initializer๊ฐ ์๋ ๊ฒฝ์ฐ
//์์ ํด๋์ค์ ์ด๊ธฐํ๊ฐ ํ์ํ ํ๋กํผํฐ๊ฐ ์์ ๊ฒฝ์ฐ
//๋์ด = 10, ๋ชธ๋ฌด๊ฒ = 20.5
//๋์ด = 1, ๋ชธ๋ฌด๊ฒ = 3.5
//๋์ด = 20, ๋ชธ๋ฌด๊ฒ = 65.5
//๋์ด = 2, ๋ชธ๋ฌด๊ฒ = 3.5
์์ ํด๋์ค์ designated initalizer
- ์์ ํด๋์ค์ init ๋ฉ์๋
init(๋งค๊ฐ๋ณ์) {
//์์ ํด๋์ค์ ํ๋กํผํฐ ์ด๊ธฐํ
//๋ถ๋ชจํด๋์ค์ designated initalizer์ ์์, super.init()
//๋๋จธ์ง ์ด๊ธฐํ ์์ค
}
์์ํด๋์ค์์ designated initalizer๋ฅผ ๋ง๋ค๋ฉด ๋ถ๋ชจ init()์์ ์๋จ
- ์์) error
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double) {
self.age = age
self.weight = weight
}
convenience init(age: Int){
self.init(age:age, weight: 3.5)
}
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
var lee : Man = Man(age: 1)
lee.display()
//์์
class Student : Man {
var name : String
init(name: String){
self.name = name
}
}
var kim1: Student = Student(age: 20, weight: 65.5)
kim1.display()
//์๋ฌ๋จ. error : 'super.init' isn't called on all paths nefore returning from initializer
//์์ ํด๋์ค์์ designated initializer๋ฅผ ๋ง๋ค๋ฉด ๋ถ๋ชจ์ init()์ด ์์ ์๋จ.
๋ถ๋ชจ๊ฒ์ initํ๊ฒ ๋ค๊ณ override init๊ณผ super.init์ฌ์ฉํด์ผ ํจ
class Man {
var age : Int
var weight : Double
func display(){
print("๋์ด = \(age), ๋ชธ๋ฌด๊ฒ = \(weight)")
}
init(age: Int, weight: Double) {
self.age = age
self.weight = weight
}
convenience init(age: Int){
self.init(age:age, weight: 3.5)
}
}
var kim : Man = Man(age: 10, weight: 20.5)
kim.display()
var lee : Man = Man(age: 1)
lee.display()
class Student : Man {
var name : String
override init(age: Int, weight: Double){ //=>๋ถ๋ชจ๊ฒ์ initํ๋ค๊ณ ์จ์ผํจ
self.name = "Kim" //์๊ธฐ ๊ฒ์ kim์ผ๋ก ์ด๊ธฐํํ๊ณ
super.init(age: age, weight: weight) //age์ weight๋ฅผ ๋ฐ์์ kim1์ ํ์ฉ
}
}
var kim1: Student = Student(age: 20, weight: 65.5)
kim1.display()
var lee1: Student = Student(age: 5) //convenience initializer์ค๋ฒ๋ผ์ด๋ ํ๋ฉด ์์์ด ๋๊ธฐ๋๋ฌธ์ weight 3.5๋ก ์๋์ผ๋ก ๋ค์ด๊ฐ
lee1.display()
//๋ถ๋ชจ ํด๋์ค์ convenience initializer๋ง ์์
๋์ด = 10, ๋ชธ๋ฌด๊ฒ = 20.5
๋์ด = 1, ๋ชธ๋ฌด๊ฒ = 3.5
๋์ด = 20, ๋ชธ๋ฌด๊ฒ = 65.5
๋์ด = 5, ๋ชธ๋ฌด๊ฒ = 3.5
- ๋ถ๋ชจํด๋์ค์ init๋ฉ์๋
required init() {
}
- ์์ ํด๋์ค์์ ๋ฐ๋์ required ํค์๋๋ก ์ฌ ์์ฑํด์ผํจ
Model View Controller
- Model : data&logic
- View : user inter face
- Controller : Mediator
๋ชจ๋ธ๊ณผ ๋ทฐ๋ ์ ๋ ์๋ก ์ง์ ์ ์ธ ์์ ํธ๋ฅผ ์ฃผ๊ณ ๋ฐ์ง ์๊ณ ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด์ ํจ. ์ฅ์ ์ ์ดํ์ ์๋ก์ด ๋ฒ์ ์ ๋ง๋ค๋ ๋ค๋ฅธ ํ ๋ง ๋ฑ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฉ์ด.
๋ฒ๋ค ์ค๋ธ์ ํธ๋ ๋ฒ๋ค ๊ตฌ์กฐ, ์ฌ์ฉ์ ํ๊ฒฝ์ค์ , ์ฌ์ฉ ๊ฐ๋ฅํ ํ์งํ ๋ฐ ๊ธฐํ ๊ด๋ จ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ํญ๋ชฉ์ ์ฐพ๊ธฐ ์ํ ๋จ์ผ ์ธํฐํ์ด์ค ์ ๊ณต. ์ฑ ๋ด๋ถ, ๋ค๋ฅธ ์์น์ ๋ฒ๋ค์์ ๋ฆฌ์์คํ ์ ์์.
[๋ฒ๋ค๊ฐ์ฒด ์ฌ์ฉ์ ์ผ๋ฐ์ ํจํด]
- ์ํ๋ ๋ฒ๋ค๋๋ ํ ๋ฆฌ์ ๋ํ ์ค๋ธ์ ํธ ์์ฑ.
- ๋ฒ๋ค ์ค๋ธ์ ํธ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์์์ ์ฐพ๊ฑฐ๋ ๋ก๋
- ๋ค๋ฅธ ์์คํ API๋ฅผ ์ฌ์ฉํ์ฌ ์ํธ์์ฉ
๋ฒ๋ค์ฐพ๊ธฐ ๋ฐ ์ด๊ธฐ
// Get the app's main bundle
let mainBundle = Bundle.main
// Get the bundle containing the specified private class.
let myBundle = Bundle(for: NSClassFromString("MyPrivateClass")!)
๋ฒ๋ค์์ ๋ค๋ฅธ ๋ฆฌ์์ค ์ฐพ๊ธฐ
NSBundle *main = [NSBundle mainBundle];
NSString *resourcePath = [main pathForResource:@"Seagull" ofType:@"jpg"];
ํ์ฌ ํ๋ก์ ํธ์ ํด๋น๋๋ ์ด๋ฆ๊ณผ ํ์ ์ ํ์ผ์ ๊ฐ์ ธ์จ๋ค.
let path: Bundle.main.path(forResource: "CafeList", ofType: "json")
//๋ฆฌ์์ค - "CafeList" ,๋ฐ์ดํฐ ํํ - "jsonํ์
"
nib : Next Interface Builder์ ์ฝ์ (๋ฐ์ด๋๋ฆฌ binary)
xib : Xml Interface Builder์ ์ฝ์ (xml๊ธฐ๋ฐ)
- nib์ xib๋ ๊ธฐ๋ฅ์ ์ผ๋ก ๊ฑฐ์ ๋์ผํจ.
- xib๊ฐ "ํ๋ซํ์ผ"์ ์ ์ฅ๋๋ค๋ ์ ์ด ๋ค๋ฆ (flat file: ํ๋ซํ์ผ์ ์๋ฌด๋ฐ ๊ตฌ์กฐ์ ์ํธ๊ด๊ณ๊ฐ ์๋ ๋ ์ฝ๋๋ค์ด ๋ค์ด ์๋ ํ์ผ)
- xib๋ bundle์ด ์๋ ํ๋ซํ์ผ์ด๊ธฐ ๋๋ฌธ์, SCM(source control management: ์์ค์ ์ด๊ด๋ฆฌ)์์คํ ์ ๋นํด ์ฝ๊ฒ ์ฒ๋ฆฌ๊ฐ๋ฅ. (๋ฐ์ด๋๋ฆฌ๋ก ์ ์ฅํ์ง ์๊ณ xml ํํ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์์ ๋ ๋ถ๋ถ์ ์ ์ ์์ด์ ํ์ผ ๊ด๋ฆฌ๊ฐ ์๋ ์์ค์ฝ๋๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง)
- ๋น๋์, xib๊ฐ ์ฑ์ ํฌํจ๋ nib๋ก ์ปดํ์ผ๋๋ฉด์ ์ฌ์ฉ๋จ. (xib๋ฅผ ์ปดํ์ผํ๋ฉด nib๊ฐ ๋ง๋ค์ด์ง)
- nib๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฐ์ด๋๋ฆฌ๋ฏ๋ก nibํ์ผ๊ณผ ํจ๊ป SVN์ฌ์ฉ์ ๋ฌธ์ ๋ฐ์. ๊ทธ๋์ xib๊ฐ nib๋ฅผ ๋์ ํจ
- nib๋ diff๋ฅผ ์ํํ ์ ์๊ณ , ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ฒ๋ฆฌํด์ผํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค๊ณ ํ๋จ
-
SDK๋ ํน์ ํ๋ซํผ์ ๋์์ผ๋กํ๋ ์ํํธ์จ์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉํ ์์๋ ๋๊ตฌ ๋ชจ์. SDK์๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๋ฐ ๋์์ด๋๋ ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ค๋ช ์ ๋ฐ ์ํ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋ค. ์๋ฅผ๋ค๋ฉด, ํ์ด์ค๋ถ SDK, ์ธ์คํ SDK, iOS SDK ๋ฑ.. ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ผ๋ถ SDK๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋๋ฒ๊น ์ ํธ๋ฆฌํฐ ๋ฑ์ ํฌํจํ๋ Java SDK (JDK)๋ก, Java์์ ํ๋ก๊ทธ๋จ ์์ฑ์ ํจ์ฌ ์ฝ๊ฒ ํด์ค๋ค. SDK๋ ์๋ก ํธํ๋๋ ๊ตฌ์ฑ ์์ / ๋๊ตฌ๋ฅผ ์ฐพ์ ํ์๊ฐ์๊ณ ๋ชจ๋ ํจํค์ง๊ฐ ์ค์นํ๊ธฐ ์ฌ์ด ๋จ์ผ ํจํค์ง์ ํตํฉ๋์ด ์์!
-
API๋ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์ด ์๋ก ์ํธ ์์ฉํ ์์๋ ์ธํฐํ์ด์ค์. API๋ ์๋ก ํต์ ํ๊ธฐ ์ํด ํ๋ก๊ทธ๋จ์ด ๋ฐ๋ผ์ผํ๋ ์ผ๋ จ์ ๊ท์น์ ์ ์ํ๊ณ , ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ํต์ ํ๊ธฐ ์ํด ๋ฃจํด, ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฑ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ค. ์ฌ๋ก๋ก, API์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ Java API์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ผ๋ฐ API๊ฐ ์๊ณ , Google Maps API์ ๊ฐ์ ํน์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ API๋ ์๋ค. ์ธ์ด ๋ณ API๋ ์์ผ๋ฉฐ ์ด๋ ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ง ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ๋ํ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํจ๊ป ์ฌ์ฉํ ์์๋ ์ธ์ด ๋ ๋ฆฝ์ ์ธ API๊ฐ ์๋ค. ์ด ์ฒ๋ผ, API๋ ํ์ํ ๊ธฐ๋ฅ์ด๋ ๋ฐ์ดํฐ ๋ง ์ธ๋ถ์ ๋ ธ์ถ์ํค๋ฉด์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์๋ ์ก์ธ์ค ํ ์ ์๋๋กํ๋ค. ๋, ์ผ๋ถ ๊ธฐ๋ฅ ๋ฐ ๋ฐ์ดํฐ๋ฅผ API๋ฅผ ํตํด ์น ์ธ๋ถ๋ก ํ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ ๋ฆฌ API๋ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์ด ์๋ก ์ํธ ์์ฉํ ์์๋ ์ธํฐํ์ด์ค ์ธ ๋ฐ๋ฉด SDK๋ ํน์ ํ๋ซํผ์ ๋์์ผ๋กํ๋ ์ํํธ์จ์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉํ ์์๋ ๋๊ตฌ ๋ชจ์์ด๋ผ๋ ๊ฒ. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฒ์ ์ SDK๋ ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ํธ ์์ฉํ๋ ๋ฐ ํ์ํ ์ผ๋ถ ํ์ผ์ด ํฌํจ ๋ API ์ผ ์ ์๋ค. ๋ฐ๋ผ์ API๋ ๋ชจ๋ ๋๋ฒ๊น ์ง์ ๋ฑ์ด์๋ ๊ฐ๋จํ SDK๋ก ๋ณผ ์ ์๋ค.
- bug : ๋ฒ๊ทธ
- debug : ๋ฒ๊ทธ๋ฅผ ์์ค๋ค.
[๋๋ฒ๊น ํ๋ก์ธ์ค]
- ๋ฌธ์ ์๋ณ ๋ฐ ๋ฐ์ ์์น ์ฐพ๊ธฐ
- ์คํ์ฝ๋์ ์ ์ด ํ๋ฆ ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์กฐ์ฌํ์ฌ ์์ธ ๊ท๋ช
- ์๋ฃจ์ ์ ๊ณ ์ํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ฝ๋ ์์
- ์์ ๋ ์ฑ์ ์คํํ๊ณ ์์ ๋ ์ฝ๋๊ฐ ์ ๋์ํ๋์ง ํ์ธ
LLVM - Xcond์ ์ปดํ์ผ๋ฌ + ํด์ฒด์ธ
LLDB - LLVMํ๊ฒฝ์์ ๋์ํ๋ ๋๋ฒ๊ฑฐ , LLDB๋ ๋ช ๋ น ํ ๋๋ฒ๊ฑฐ๋ ๋ชจ๋ Apple ํ๋ซํผ์์์ ๊ฐ๋ฐ์ ์ํ ๊ธฐ๋ณธ ๋๋ฒ๊น ์๋น์ค ์ ๊ณตํจ
@objc func basicDebugging(_ sender: UIButton){
var sum = 0
for i in 0...100{
sum += i
}
print(sum)
}
Debugger Command
help apropos
help po
p list
p number
- help - ๋ช ๋ น์ด ๋์ด ๋ฐ ๋์๋ง ์ถ๋ ฅ
- apropos - ๋จ์ด๋ ํน์ ์ฃผ์ ์ ๋ํ ๋ด์ฉ ๊ฒ์
- po(print object) - DebugDescription ๋๋ description๋ด์ฉ ์ถ๋ ฅ ( DebugDescription > description ์ฐ์ ์์ )
- p - LLDB ๊ธฐ๋ณธ ํ์์ผ๋ก ์ถ๋ ฅ
- expression - ์๋ก์ด ๋ณ์ ๋ฃ๊ธฐ. ์๋ํฐ ์ฝ๋๋ฅผ ๋ฃ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ.(์ธ๋ผ์ธ์ผ๋ก ์์ฑ)
- ์์)
e
(lldb) p let $myValue = 3
(lldb) p $myValue
(Int) $R82 = 3
- ์์์ ๊ฐ์ ์ ์ธํ๊ณ ์ถ๋ ฅ ํด๋ณผ ์ ์์.
e
1 let $myView = UIView()
2 $myView.backgroundColor = .red
3 $myView.frame = .init(x: 100, y: 100, width: 100, height: 100)
4 self.view.addSubview($myView)
5
c
c(์ปจํฐ๋ด๋ก ์์ฑ)
- ์์์ View๋ฅผ ๋ง๋ค ์ ์์. (์๋ณ๊ฒฝ, ์คํ ๋ ์ด์์ ๋ฑ ๊ฐ๋ฅ)
Veiw์ฃผ์๊ฐ์ ํตํด ์กฐํ [ Obj-C ], [ Swift ] ๋ฒ์ .
[ Obj-C ]
(lldb) e ((UIButton *)0x7fea7d30af20).backgroundColor = [UIColor redColor]
[ Swift ]
(lldb) e -l swift -- import UIKit
(lldb) e -l swift -- unsafeBitCast(0x7fea7d30af20, to: UIButton.self).backgroundColor = .blue
๋งํฌ : SwiftUI ๋ ํผ์งํ ๋ฆฌ๋ก ์ด๋
swiftUI์๊ฐ https://developer.apple.com/kr/xcode/swiftui/
ํํ ๋ฆฌ์ผ https://developer.apple.com/tutorials/swiftui/tutorials
- Objective-C์ UIKit๋ class ๊ธฐ๋ฐ์ , SwiftUI๋ struct๊ธฐ๋ฐ(๊ตฌ์กฐ์ฒด)
- iOS. tvOS. macOS - AppKit, watchOS - watchKit ์ฒ๋ผ ์๋ง์ Kit๋ฅผ ์ด์ฉํด์ผํ์ง๋ง, SwiftUI๋ ๋ชจ๋ ๊ธฐ์ข ํธํ๊ฐ๋ฅ.
-
View์ body๋ก ๊ตฌ์ฑ๋จ. ๊ทธ ์ค body๋ฅผ ๊ตฌํํ๋๊ฒ . (some View => ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ๋ทฐ). ๋ทฐ์ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ์ด๋ค ๊ฒ someView.
-
Assets.xcassets(์์ ) ์ฑ ์ถ์์ ์ฌ์ฉํ๋ ์ด๋ฏธ์ง์ preview Assets.xcassets(ํ๋ฆฌ๋ทฐ์์ ) ๊ฐ๋ฐํ๋ ๋์์๋ง ์ฌ์ฉํ๋ ์ด๋ฏธ์ง๋ก ๊ตฌ๋ถ๋จ.
-
์๋ฎฌ๋ ์ดํฐ๊ฐ ์๋, ํ๋ฆฌ๋ทฐ(preview)์ด์ฉ.
-
๋ฉ์๋์ฒด์ด๋์ ํํ. ~ (์ ์ธ์ ๊ตฌ๋ฌธ) ์์)
Text(โASDR")
.Font(.title)
.fintWeight(.balck)
.italic()
- ์์ฑ๊ฐ์ ๋ถ๋ฌ์ด
- modifier ๋ method์ด์ง๋ง, ์์์ด์ ๋น์ทํ ์์ฑ์ ๊ฐ์ง (๋ทฐ์์ ์ฌ์ฉ๊ฐ๋ฅํ ๋ฉ์๋, ์ด๋ค ๋ณํ๋ฅผ ๊ฐ๋ฏธํ ์๋ก์ด ๋ทฐ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋. ์๋ณธ์ ๊ทธ๋๋ก ๋๊ณ , ๊ณ์ ๋ณ๊ฒฝํด ๋๊ฐ๋ ๊ฒ. ๋ง์น ํด๋๊ฐ๋ ๊ฒ.)
import SwiftUI
struct Ex01_Text: View {
var body: some View {
//2.someView๋ฅผ๋ฐํํ๋ ์ฐ์ฐํ๋กํผํฐ๋ผ์ ๊ทธ๋ฅ ์ฌ๊ธฐ๋ค๊ฐ ๊ฐ๋ค ์
example05 //<- ํจ์ ํธ์ถํ๋ฏ์ด ์ด๊ณณ์ ํด๋นํ๋ someViewํธ์ถ.
}
//error = Compiling failed: extra tokens at the end of #sourceLocation directive
var example01: some View {
//1.swiftUI๋ ๋ ๋ถ๋ถ์ retrun์ด ์๋ต๋์ด ์์(๋ณดํต View๋ฅผ ํํํ ๋๋ ์๋ต)
Text("Hello, SwiftUI")
// .font(.headline)
.fontWeight(.light)
.foregroundColor(Color.purple)
// .font(.system(size: 40, weight: .light))
.font(.custom("AppleGothic", size: 40))
.blur(radius: 3.0)
// cmd+shif+L ๋ก ๋์ด์์ ์ธ์๋ ์์.
}
// (ํ
์คํธ๊ฐ์ ํฉ์ฑ ์ฉ์)
var example02: some View {
Text("Hello").font(.headline)
.foregroundColor(.blue)
.italic()
+
Text("SwiftUI").font(.largeTitle)
.foregroundColor(.green)
.baselineOffset(8)
}
//๋ฐ์ค ๊ธ๊ธฐ๋ฑ
var example03: some View {
Text("Hellow, Qussk")
.font(.title)
.kerning(5)
.underline(true, color: .orange)
.strikethrough(true, color: .blue)
}
//์ค์!: ์์์ด ์ ์ฉ์ ์์ ์ฃผ์.
var example04: some View {
Text("Qussk")
.font(.largeTitle) //Text
.bold() //Text
.background(Color.yellow)
//View
// Text("Qussk")
// .font(.largeTitle) //View - ์์์ ์์ฑ์ด ๋ฐ๋.
// .background(Color.yellow) //Veiw
// .bold() => text๊ฐ ๊ฐ์ง ์์ฑ //Text
// -background๊ฐ ๊ฐ์ง ์์ฑ์ View~ ๋ฐํํ์
๋ View์ด๊ธฐ ๋๋ฌธ์ bold()๋ฅผ ์ธ์ ์์.
}
//๋ด์ฉ์ ๊ฐ์๋ฐ ์์๊ฐ ๋ค๋ฅด๋ค. why?
var example05: some View {
VStack(spacing: 20) {
//spacing: ๋ทฐ๊ฐ์ ๊ฐ๊ฒฉ
Text("๐ฐ๐ฆ๐ป๐ผ").font(.largeTitle)
.padding()
.background(Color.yellow)
//๋ทฐ์ ํฌ๊ธฐ๋งํผ ๋ฐฐ๊ฒฝ์์ ์ฃผ๋๋,
Text("๐ถ๐ฑ๐ญ๐น").font(.largeTitle)
.background(Color.green)
//๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ฃผ๊ณ , ๋ทฐ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋๋
.padding()
}
}
}
/*
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ด๋ฐ ์ ๋ ฌํจ.
*/์๋์ฒ๋ผ ์ฌ๋ฌ๊ฐ๋ฅผ ํ ๊บผ๋ฒ์ ๋ณผ ์ ๋ ์์.
//์ด๊ฒ ๋๋ฌธ์ Preview๊ฐ ๋์ฌ ์ ์์.
//struct Ex01_Text_Previews: PreviewProvider {
// static var previews: some View {
// Group {
// Ex01_Text()
// .previewLayout(.sizeThatFits)
// //.previewLayout(.fixed(width: 300, height: 200))
//
// Ex01_Text()
// .preferredColorScheme(.dark)
// .previewDisplayName("iPhon 11")
// .previewDevice(PreviewDevice(rewValue: "iPhon 11"))
//
// Ex01_Text()
// .preferredColorScheme(.dark)
// .previewDisplayName("iPhon 8")
// .previewDevice(PreviewDevice(rewValue: "iPhon 8"))
//
// }
// }
//}
//}
struct Ex01_Text_Previews2: PreviewProvider {
static var previews: some View {
Ex01_Text()
.preferredColorScheme(.light)
}
}