Skip to content
/ Swift-5 Public

๐Ÿƒโ€โ™€๏ธ~ ! ~ You can do Swift ~ ! ~ ๐Ÿ‘๐Ÿคธโ€โ™€๏ธ

License

Notifications You must be signed in to change notification settings

Qussk/Swift-5

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Swift-5.0

  • You can refer to it through the playground
  • You can use swift
  • Now Submit to Swift

๊ฐœ๋ฐœ๋กœ๋“œ๋งต

iOS

Swift

iOS

WWDC 2020

Swift

[๋ฌธ๋ฒ•]

[Xcode]

[SwiftUI]

Language house(in Swift)

Objective-C์™€swift์ฐจ์ด

  • swift๋Š” ios8์— ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋จ.
  • swift๋Š” ํƒ€์ž… ์ถ”์ •, ํƒ€์ž… ์„ธ์ดํ”„๊ฐ€ ์ œ๊ณต๋จ.(๋ช…์‹œํ•  ํ•„์š” ์—†์–ด์ง)
  • swift๋Š” isEqual๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•  ํ•„์š”์—†์ด == ์—ฐ์‚ฐ์ž๋งŒ์œผ๋กœ ๋น„๊ต๊ฐ€๋Šฅ.
  • swift๋Š” switch๋ฌธ์œผ๋กœ ๋ถ„๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•จ. objective-c๋Š” if๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ–ˆ์Œ.
  • swift๋Š” Genericํƒ€์ž… ์ œ๊ณต.
  • Objective-C๋Š” class, swift๋Š” struct ๊ธฐ๋ฐ˜์ž„.

AppDelegate

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 : ์•ฑ์ด ์ข…๋ฃŒํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ


iOSApplicationState

Not Running : ์•ฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์‹œ์Šคํ…œ์— ์˜ํ•ด ์ข…๋ฃŒ๋œ ์ƒํƒœ.

Active : ์•ฑ์ด Foreground์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๊ณ , ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ.

Inactive : ์•ฑ์ด Foreground์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ์œผ๋‚˜, ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ

Background : ์•ฑ์ด Foreground์—์„œ ์‹คํ–‰์ค‘์ธ ์ƒํƒœ, Home๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ผ์‹œ์ ์œผ๋กœ Background์ƒํƒœ๊ฐ€ ๋จ

Suspended : ์‹คํ–‰์ด ์ค‘๋‹จ๋˜์–ด ๋Œ€๊ธฐ์ค‘์ธ ์ƒํƒœ, ์ž ์‹œ๋™์•ˆ Background์ƒํƒœ๋ฅผ ๊ฑฐ์นœ ํ›„์— ์ด ์ƒํƒœ๊ฐ€ ๋จ


ViewControllerLifeCycle

  • ViewController์—์„œ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์กŒ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ์ฃผ๊ธฐ๋ฅผ ์ผ์ปฌ์Œ.

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์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๊ณ  ๋ฐœ์ƒ์‹œ ๋ทฐ๊ฐ€ ํ•ด์ œ๋˜์–ด ์‚ฌ๋ผ์ง€๋Š” ๋ฉ”์†Œ๋“œ

MainRunLoop

  • ์œ ์ €๊ฐ€ ์ผ์œผํ‚ค๋Š” input์ด๋ฒคํŠธ ๋“ค์„ ์ฒ˜๋ฆฌ/์‘๋‹ต ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค.
  • UIApplication์€ Main Run Loop ๋ฅผ View ์™€ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ๋‚˜ View ์˜ ์—…๋ฐ์ดํŠธ์— ํ™œ์šฉ. Main Run Loop ๋Š” View์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— main ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋จ.

๊ทธ๋ฆผ.์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ(user interaction) ๋ฐœ์ƒ ๋ฐ ์ฒ˜๋ฆฌ๊ณผ์ •

  1. ์œ ์ €๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ผ์œผํ‚ด(ํ„ฐ์น˜,์คŒ์ธ๋“ฑ์˜ input)
  2. ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋จ.
  3. UIKit ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ port๋กœ ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์•ฑ์œผ๋กœ ์ „๋‹ฌ 4.์ด๋ฒคํŠธ๋Š” ์•ฑ ๋‚ด๋ถ€์ ์œผ๋กœ Queue์˜ ํ˜•ํƒœ๋กœ ์ •๋ฆฌ๋˜๊ณ , Main Run Loop์— ํ•˜๋‚˜์”ฉ ๋งคํ•‘๋จ.
  4. Application object(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒด)๋Š” ์œ ์ €๋กœ๋ถ€ํ„ฐ์˜ input ์ด๋ฒคํŠธ๋ฅผ ํ•ด์„ํ•˜๊ณ  ๊ทธ์— ์ƒ์‘๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Core object๋“ค ์•ˆ์— ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœ(์—ฌ๊ธฐ์„œ ํ•ธ๋“ค๋Ÿฌ๋ž€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ฝ”๋“œ)
  5. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๋‹ค์‹œ ์ปจํŠธ๋กค์€ main run loop๋กœ ๋Œ์•„๊ฐ€์„œ Update Cycle์ด ๋‹ค์‹œ ์‹œ์ž‘๋จ
  6. Update Cycle์€ View ๋“ค์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ์—ญํ• 

๊ทธ๋ฆผ.์ „๋‹ฌ๋ฐ›์€ ์ด๋ฒคํŠธ๋ฅผ ์•ฑ์˜ run loop์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •

  1. run loop ๋Œ€๊ธฐ ์ค‘ ์ด๋ฒคํŠธ ๋ฐœ์ƒ(์ฃผ๋กœ ์ž…๋ ฅ์†Œ์Šค์™€ ํƒ€์ด๋จธ์†Œ์Šค ์ฒ˜๋ฆฌ)
  2. ์ •ํ•ด์ง„ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ(ํƒ€์ด๋จธ์—์„œ ์„ค์ •ํ•œ ์‹œ๊ฐ„๋ฐ ๋”ฐ๋ผ)
  3. ๋ฉ”์†Œ๋“œ ์™„๋ฃŒ ํ›„ ๋ณ€๊ฒฝ๋  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์‚ฌํ•ญ ์ ์šฉ(๋ทฐ์˜ ๊ฒฝ์šฐ setNeedsLayout, setNeedsDisplay)
  4. runUntil- ๋ฉ”์†Œ๋“œ์—์„œ ์ •ํ•œ ์‹œ๊ฐ„๊นŒ์ง€ ์œ ์ง€, ํ• ์ผ ์—†์œผ๋ฉด suspend ์ƒํƒœ. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

UpdateCycle

  • 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์ด ์–ธ์ œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ


Layout

  • ํ™”๋ฉด์—์„œ 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 ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ.

Display

  • 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๊ฐ€ ํ˜ธ์ถœ ๋จ

Constraints

  • 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)

์ •๋ฆฌ

  1. View์˜ Layout๊ณผ Display ๊ทธ๋ฆฌ๊ณ  Constraints๋Š” run loop์—์„œ ๋‹ค๋ฅธ ์‹œ์ ์— ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธ๋˜๊ณ , ๋ช…์‹œ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ํŒจํ„ด์„ ๊ฐ€์ง.
  2. ๊ฐ ์ปดํฌ๋„ŒํŠธ๋“ค์€ layoutSubviews, draw, updateConstraints๊ณผ ๊ฐ™์€ ์‹ค์ œ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ „ํŒŒํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๊ฐ€์ง€๋ฉฐ, ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์œ ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ์Œ
  3. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋“ค์€ run loop์˜ ๋งˆ์ง€๋ง‰์— View์˜ ํ•ด๋‹น flag๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด์žˆ์œผ๋ฉด ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ž„.
  4. ๋ช‡ ๊ฐ€์ง€์˜ ์ž๋™์ ์œผ๋กœ ์ด Flag๋“ค์„ ํ™œ์„ฑํ™”ํ•ด์ฃผ๋Š” ๋ฐฉ์‹๋“ค์ด ์žˆ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”์‹œ์ผœ์ฃผ๋Š” ๋ฐฉ์‹๋„ ์žˆ์Œ.
  5. Layout๊ณผ Constraints์— ๊ด€๋ จ๋œ ์—…๋ฐ์ดํŠธ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋งŒ์•ฝ ๋‹ค์Œ Update Cycle๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†๋‹ค๋ฉด, ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค๋„ ์กด์žฌํ•จ.
  6. ์•„๋ž˜์™€ ๊ฐ™์€ ํ‘œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ ๋ฉ”์„œ๋“œ๋“ค์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž„.

  • ์œ„ ํ‘œ๋ฅผ ๋ณด๋ฉด Update Cycle๊ณผ Event Loop ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด Cycle ๋™์•ˆ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๋Š”์ง€ ์„ค๋ช…์ด ๋จ.
  • ์šฐ๋ฆฌ๋Š” ๋ช…์‹œ์ ์œผ๋กœ layoutIfNeeded๋‚˜ updateConstraintsIfNeeded๋ฅผ run loop์˜ ์•„๋ฌด ์‹œ์ ์—์„œ๋‚˜ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , loop์˜ ๋์€ Update Cycle์ž„.
  • Update Cycle์€ Constraints, Layout ๊ทธ๋ฆฌ๊ณ  Display๋ฅผ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด์žˆ๋‹ค๋ฉด ์—…๋ฐ์ดํŠธํ•ด์คŒ.
  • ์ด๋Ÿฌํ•œ ์—…๋ฐ์ดํŠธ๋“ค์ด ์™„๋ฃŒ๋˜๋ฉด, run loop๋Š” ๋‹ค์‹œ ์‹œ์ž‘ํ•จ..... ใ…Ž ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์œผ๋กœ


CALayer

  • UIView๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ CALayer๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋จ. ๋˜, Core Animation๊ณผ ์ƒํ˜ธ์ž‘์šฉ
  • ๋ ˆ์ด์–ด์˜ ์œ„์น˜์™€ ํฌ๊ธฐ / ๋ ˆ์ด์–ด์˜ ๋ฐฐ๊ฒฝ์ƒ‰/ ๋ ˆ์ด์–ด์— ๊ทธ๋ ค์งˆ ์ปจํ…ํŠธ (์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ํ˜น์€ Core Graphic๋ฅผ ํ†ตํ•ด ๊ทธ๋ ค์ง„ ๊ทธ๋ž˜ํ”ฝ ๋“ฑ)/ ๋ ˆ์ด์–ด์˜ ๋ชจ์„œ๋ฆฌ๊ฐ€ ๋™๊ธ€๊ฒŒ ๊ทธ๋ ค์ ธ์•ผ ํ•˜๋Š”์ง€/๋ ˆ์ด์–ด์— ๊ทธ๋ฆผ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ/ ๋ ˆ์ด์–ด์— ์™ธ๊ณฝ์„ ์„ ๊ทธ๋ ค์ฃผ๊ธฐ ๋“ฑ
  • CALayer๋Š” ์‹ค์ œ๋กœ UIView์— ์†ํ•˜๋ฉฐ UIView๋ฅผ ์ง€์›ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•จ
  • ๊ฐ ๋ทฐ๋งˆ๋‹ค ๋ฃจํŠธ layer๋Š” ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๊ณ  ์ด ๋ฃจํŠธ layer๋Š” ๊ฐ๊ฐ SubLayer๋“ค์„ ๊ฐ€์ง.
  • UIView๋Š” ๋ ˆ์ด์•„์›ƒ๊ณผ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋“ฑ ๋งŽ์€ ์ž‘์—…์„ ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ทฐ ์œ„์— ์ปจํ…์ธ ๋‚˜ ์• ๋‹ˆ๋งค์ด์…˜์„ ๊ทธ๋ฆฌ๋Š” ํ–‰์œ„๋Š” ์ง์ ‘์ ์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  UIKit๊ฐ€ Core Animation์— ์œ„์ž„ํ•จ. ์ฆ‰, ์‹ค์งˆ์ ์œผ๋กœ ๋ทฐ ์œ„์— ์ปจํ…์ธ ์™€ ์• ๋‹ˆ๋งค์ด์…˜์„ ๊ทธ๋ฆฌ๋Š” ํ–‰์œ„๋Š” CALayer๊ฐ€ ๋‹ด๋‹น


Core Animation

  • 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(๋“œ๋กœ์ž‰ ์‚ฌ์ดํด)


UIClassDiagram

  • 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(๊ณต๋ฐฑ์„ ๋ช…ํ™•ํžˆ ์ฒ˜๋ฆฌํ•  ๊ฒƒ)

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ๊นƒ๊ฐ’์„ ์ฃผ์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋งŒ ์ž๋ฃŒํ˜•์„ ์”€.

Int

  • ์ •์ˆ˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…
    • ์–‘์ˆ˜, ์Œ์ˆ˜, 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ํ˜•์ด ๊ธฐ๋ณธ
  • Double : 64๋น„ํŠธ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜๋ฅผ ์ €์žฅ, ์†Œ์ˆ˜์  15์ž๋ฆฌ ์ •ํ™•๋„
  • Float : 32๋น„ํŠธ๋กœ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜๋ฅผ ์ €์žฅ, ์†Œ์ˆ˜์  6์ž๋ฆฌ ์ •ํ™•๋„
var myWeight : Double
var myWeight : Double = 58.5

Bool

  • ์ฐธ ๋˜๋Š” ๊ฑฐ์ง“์„ ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…
  • Boolean ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋‘๊ฐœ์˜ ๋ถˆ๋ฆฌ์–ธ ์ƒ์ˆ˜ ๊ฐ’(true/false)์‚ฌ์šฉ
var orangesAreOrange : Bool
var orangesAreOrange : true  

Character

  • ๋ฌธ์ž, ์ˆซ์ž, ๋ฌธ์žฅ๋ถ€ํฌ, ์‹ฌ๋ณผ ๊ฐ™์€ ์œ ๋‹ˆ์ฝ”๋“œ(Unicode)๋ฌธ์ž ํ•˜๋‚˜๋ฅผ ์ €์žฅ
  • ์Šค์œ„ํ”„ํŠธ์—์„œ์˜ ๋ฌธ์ž๋“ค์€ ๋ฌธ์ž์†Œ ๋ฌถ์Œ(Grapheme cluster)์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ
  • ๋ฌธ์ž์†Œ ๋ฌถ์Œ์€ ํ•˜๋‚˜์˜ ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ๊ฐ’๋“ค๋กœ ์ด๋ฃจ์–ด์ง
  • var ๋ณ€์ˆ˜๋ช… : Character = "์ดˆ๊นƒ๊ฐ’"
var myChar1 : Character
var myChar2 : Character = ":"
var myChar3 : Character = "X"
//Character๋Š” ์ƒ๋žต๋ถˆ๊ฐ€, ์ƒ๋žตํ•˜๋ฉด Stringํ˜•์ด ๋จ. 
  • ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์— ๋ฌธ์ž X๋ฅผ ํ• ๋‹น
  • var myChar4 = "\ u{0058}"

String

  • ๋‹จ์–ด๋‚˜ ๋ฌธ์žฅ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ผ๋ จ์˜ ๋ฌธ์ž
  • ์ €์žฅ, ๊ฒ€์ƒ‰, ๋น„๊ต, ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ, ์ˆ˜์ • ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จ
  • ๋ฌธ์ž์—ด ๋ณด๊ฐ„(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๋ฐ”์ดํŠธ ์œ ๋‹ˆ์ฝ”๋“œ ์Šค์นผ๋ผ

var

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€์ˆ˜(variable)๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
  • ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฐ’์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
  • var myVariable = 10
  • var x = 0.0 , y = 0.0 , z = 0.0 (๋‹ค์ค‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

let

  • ์ƒ์ˆ˜(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)๊ฐ€ ๋ฐœ์ƒ

Tuple

  • ํŠœํ”Œ์€ ์Šค์œ„ํ”„ํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ค‘ ํ•˜๋‚˜
  • ์—ฌ๋Ÿฌ ๊ฐ’์„ ํ•˜๋‚˜์˜ ๊ฐœ์ฒด์— ์ผ์‹œ์ ์œผ๋กœ ๋ฌถ๋Š” ๋ฐฉ๋ฒ•
  • ํŠœํ”Œ์— ์ €์žฅ๋˜๋Š” ํ•ญ๋ชฉ๋“ค์€ ์–ด๋– ํ•œ ํƒ€์ž…๋„ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ €์žฅ๋œ ๊ฐ’๋“ค์ด ๋ชจ๋‘ ๋™์ผํ•œ ํƒ€์ž…์ด์–ด์•ผํ•œ๋‹ค๋Š” ์ œ์•ฝ๋„ ์—†์Œ
  • 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

ํ˜• ๋ณ€ํ™˜(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)
  • is ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’์˜ ํƒ€์ž… ๊ฒ€์‚ฌ(Type check)
    • ์ง€์ •๋œ ๊ฐ์ฒด๊ฐ€ MYClass๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ๊ฒ€์‚ฌ
    • ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด๋‹น ํด๋ž˜์Šค์ธ๊ฐ€?
    • ์ธ์Šคํ„ด์Šค is ํด๋ž˜์Šค
if mtobject is MyClass {
  //myobject๋Š” MyClass์˜ ์ธ์Šคํ„ด์Šค์ด๋‹ค
}

Any

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ํ•ฉ๋ณ‘์—ฐ์‚ฐ์ž

  • 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)")

์ œ์–ด๋ฌธ

for

  • ์กฐ๊ฑด-์ฆ๊ฐ€(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

while

  • 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

: ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ธฐ

  • ๋ฐ˜๋ณต๋ฌธ์„ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ์ด ์™„๋ฃŒ๋˜๋Š” ์กฐ๊ฑด์— ๋‹ค๋‹ค๋ฅด๊ธฐ ์ „์— ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๋Š” ์–ด๋–ค ์กฐ๊ฑด์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Œ. (ํŠนํžˆ ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ)
  • ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ธฐ ์œ„ํ•ด 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๋Š” ๋ฐ˜๋ณต๋ฌธ์—์„œ 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 ๋ถˆ๋ฆฌ์–ธ ํ‘œํ˜„์‹ {
//๋ถˆ๋ฆฌ์–ธ ํ‘œํ˜„์‹์ด ์ฐธ์ผ ๊ฒฝ์šฐ ์ˆ˜ํ–‰๋  ์ฝ”๋“œ
}
  • ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ, ์Šค์œ„ํ”„ํŠธ์—์„œ๋Š” **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

: ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด๋ฉด ์‹คํ–‰

  • 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 ๋ชป์”€. 
    }
  }

switch

  • 'ํ‘œํ˜„์‹'์€ ๊ฐ’ ๋˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ‘œํ˜„์‹์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๊ฐ๊ฐ์˜ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋งˆ๋‹ค 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

  • 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")
(..์ค‘๋žต)
}

fallthrough

  • 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

inout๋งค๊ฐœ๋ณ€์ˆ˜

: 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๊ธ‰ ๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค.
  1. ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
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
 }
}

swiftํ•จ์ˆ˜๋ช…

  • ํ•จ์ˆ˜๋ช…(์™ธ๋ถ€๋งค๊ฐœ๋ณ€์ˆ˜ : ์™ธ๋ถ€๋งค๊ฐœ๋ณ€์ˆ˜: ...)
  • : ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜
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
}

then

  • 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๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋จ.

Class

ํ”„๋กœํผํ‹ฐ

  • ์ €์žฅ ํ”„๋กœํผํ‹ฐ : ์ธ์Šคํ„ด์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜
  • ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ : ํŠน์ • ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง
  • ํƒ€์ž… ํ”„๋กœํผํ‹ฐ : ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ํƒ€์ž…์ž์ฒด์— ์†ํŒ ํ”„๋กœํผํ‹ฐ
  • ํ”„๋กœํผํ‹ฐ ๊ฐ์‹œ์ž : ํ”„๋กœํผํ‹ฐ๊ฐ’์ด ๋ณ€๊ฒฝ์ด๋˜๋ฉด ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ์ง€(willSet, didSet)

๋ฉ”์„œ๋“œ

  • ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ : ํŠน์ •ํƒ€์ž…์— ์ธ์Šคํ„ด์Šค์— ์†ํ•œ ๋ฉ”์„œ๋“œ(์ผ๋ฐ˜์ ์ธ)
  • ํƒ€์ž…(ํด๋ž˜์Šค) ๋ฉ”์„œ๋“œ : ํƒ€์ž…์ž์ฒด์—์„œ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ

์ ‘๊ทผ์ œ์–ด

  • ์ฝ”๋“œ๋ผ๋ฆฌ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํŒŒ์ผ ๊ฐ„ ๋˜๋Š” ๋ชจ๋“ˆ๊ฐ„์— ์ ‘๊ทผ์„ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ. ์ ‘๊ทผ์ œ์–ด๋ฅผ ๊ตฌํ˜„์€ ์ˆจ๊ธฐ๊ณ  ํ—ˆ์šฉ๋œ ๊ธฐ๋Šฅ๋งŒ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ.
์ ‘๊ทผ์ˆ˜์ค€ ํ‚ค์›Œ๋“œ ์ ‘๊ทผ๋„ ๋ฒ”์œ„ ๋น„๊ณ 
๊ฐœ๋ฐฉ์ ‘๊ทผ open ๋†’์Œ ๋ชจ๋“ˆ ์™ธ๋ถ€๊นŒ์ง€ ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ
๊ณต๊ฐœ์ ‘๊ทผ public ๋ชจ๋“ˆ ์™ธ๋ถ€๊นŒ์ง€
๋‚ด๋ถ€์ ‘๊ทผ Internal ๋ชจ๋“ˆ ๋‚ด๋ถ€
๊ฐœ๋ฐฉ์ ‘๊ทผ fileprivate ๋ชจ๋“ˆ ๋‚ด๋ถ€
๋น„๊ณต๊ฐœ์ ‘๊ทผ private ๋‚ฎ์Œ ๊ธฐ๋Šฅ ์ •์˜ ๋‚ด๋ถ€

Class๊ธฐ์ดˆ

  • ์ฒญ์‚ฌ์ง„์ด๋‚˜ ์„ค๊ณ„์‚ฌ์˜ ๊ทธ๋ฆผ์ด ๊ฑด๋ฌผ์ด ์™„์„ฑ๋œ ํ›„์˜ ๋ชจ์Šต์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํด๋ž˜์Šค(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)๋ฅผ ์ •์˜ํ•œ๋‹ค
  • "์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ"๋Š” ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค
  • "ํƒ€์ž… ๋ฉ”์„œ๋“œ"๋Š” ํด๋ž˜์Šค๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

ํด๋ž˜์Šค์—property์ถ”๊ฐ€ํ•˜๊ธฐ

  • ํ”„๋กœํผํ‹ฐ๋Š” ์ดˆ๊ธฐ๊ฐ’์ด ์žˆ๊ฑฐ๋‚˜ 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.์„ ๋ถ™์ž„
  • ์•„๋ž˜ ์†Œ์Šค์—์„œ๋Š” 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()

CulatedProperty

: 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

overloading

: 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)
  1. Loaing and Caching Images //ํ•œ๋ฒˆ ์บ์‹œ๋ฅผ ํ•˜๋ฉด ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ž‡ ๋ฉ”์„œ๋“œ
  • init?(named: String, in: Bundle?, compatibleWith: UITraitCollection?)
  • init?(named: Strinf)
  • init(imageLiteralResurecName: String)
  1. 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

super

: ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์‚ฌ์šฉ

//๋ถ€๋ชจ
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: "ํ™๊ธธ๋™")

๊ด€๊ณ„๋„

override

: ๋ถ€๋ชจ์™€ ์ž์‹์— ๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ž์‹ ์šฐ์„ 

  • 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, "ํ™๊ธธ๋™"

extension

: ํ™•์žฅ

  • ์Šค์œ„ํ”„ํŠธ ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜•, 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

  • ํŠน์ • ์—ญํ• ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ. ํ”„๋กœํผํ‹ฐ, ๊ธฐํƒ€ ์š”๊ตฌ์‚ฌํ•ญ ๋“ฑ์˜ ์ฒญ์‚ฌ์ง„.
  • ๊ตฌ์กฐ์ฒด, ํด๋ž˜์Šค, ์—ด๊ฑฐํ˜•์€ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์„œ ํŠน์ • ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ.
  • ํ”„๋กœํ† ์ฝœ์€ ์ •์˜๋ฅผ ํ•˜๊ณ  ์ œ์‹œ๋ฅผ ํ•  ๋ฟ ์Šค์Šค๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ.
  • ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ์จ ์‚ฌ์šฉ๋˜๋ฉฐ, ํƒ€์ž…์ด ํ—ˆ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ณณ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
- ํ•จ์ˆ˜, ๋ฉ”์†Œ๋“œ, ์ด๋‹ˆ์…œ๋ผ์ด์ €์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž… ํ˜น์€ ๋ฆฌํ„ด ํƒ€์ž…
- ์ƒ์ˆ˜, ๋ณ€์ˆ˜, ํ”„๋กœํผํ‹ฐ์˜ ํƒ€์ž…
- ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ์˜ ์›์†Œํƒ€์ž…

๊ธฐ๋ณธ

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 ์—ด๊ฑฐํ˜• ๋ช… {
์—ด๊ฑฐํ˜• ์ •์˜
}
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)

struct

  • ๊ตฌ์กฐ์ฒด/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


print

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

func

  • 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

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

  • 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 //์œ ํšจํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ

Optionalunwrapping

  • ์˜ต์…”๋„ ์–ธ๋ž˜ํ•‘
  • ์˜ต์…”๋„ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์žˆ์œผ๋ฉด ์˜ต์…”๋„๋กœ "๋ž˜ํ•‘๋˜์—ˆ๋‹ค(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์ด ์•„๋‹ ๋•Œ๋งŒ ์–ธ๋ž˜ํ•‘ ํ•ด์•ผํ•จ.
?๋Š” ์ž๋ฃŒํ˜• ๋’ค
!๋Š” ๋ณ€์ˆ˜๋ช… ๋’ค

optionalBinding

  • ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ(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")
}

implicitlyunwrapping

  • ์•”๋ฌต์  ์–ธ๋ž˜ํ•‘ : ํ์ง€๋จ
  • ์˜ต์…”๋„์ด ํ•ญ์ƒ ์œ ํšจํ•œ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์˜ต์…”๋„์ด ์•”๋ฌต์ ์ธ ์–ธ๋ž˜ํ•‘(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์ธ๋ฐ, ์˜ต์…”๋„์ด ํ’€๋ ค์„œ ๋“ค์–ด๊ฐ.

OptionalChaining

  • 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 ๋„์ž…

throwingfunction

: throwing function

  • ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ด„ํ˜ธ ๋‹ค์Œ์— throws๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  error handing ํ•ด์•ผํ•จ //์•ˆํ•˜๋ฉด ์—๋Ÿฌ๋‚จ
  • func can() throws
  • func canTrowErrors() throws -> String
    • error handing์„ ํ•ด์•ผํ•˜๋Š” ํ•จ์ˆ˜
  • func cannotThrowErrors() -> String
    • error handingํ• ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜

  • ํ•จ์ˆ˜์—์„œ ์ด๋Ÿฐ์‹์œผ๋กœ ์‚ฌ์šฉ๋จ

dotrycatch

: 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 {
 ์ฒ˜๋ฆฌ์ฝ”๋“œ
 }

Result

  • 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 ๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ . ์ฝ”๋“œ ๊ธธ์ด!

Generic

: <>

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์€ ์ €์žฅํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€, ์‚ญ์ œ ๋ถˆ๊ฐ€


Delegate

  • ์‚ฌ์ „์ ์˜๋ฏธ : ๋Œ€ํ‘œ์ž(๋ช…์‚ฌ), ์œ„์ž„ํ•˜๋‹ค(๋™์‚ฌ)
  • 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๋กœ ์„ ์–ธ๋œ (๋ณดํ†ต ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค์˜) ๊ฐ์ฒด๋Š” ์ž์‹ ์„ ์ž„๋ช…ํ•œ ๊ฐ์ฒด(ํ…Œ์ด๋ธ”๋ทฐ, ํ”ผ์ปค๋ทฐ๋“ฑ)๊ฐ€ ์ผ์„ ๋„์™€๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด ์ง€์ •๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด์คŒ
  • ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด
    • ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋„˜๊ธฐ๋Š” ๊ฒƒ
  • ๋ณดํ†ต ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉ (๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์™€ ํ”„๋กœํ† ์ฝœ ๋—„์ˆ˜ ์—†๋Š” ๊ด€๊ณ„)

UIPickerViewDelegate

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)
  • ํ”ผ์ปค๋ทฐ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํ”„๋กœํ† ์ฝœ : ์–ด๋–ค ํ–‰๋™์— ๋Œ€ํ•œ ๋ฐ˜์‘ ๋™์ž‘ ๋ฉ”์„œ๋“œ ๋ชฉ๋ก (์ฑ„ํƒํ•˜๋”๋ผ๋„ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•  ํ•„์š”๋Š” ์—†์Œ)
  • ํ”ผ์ปค๋ทฐ ๋ฐ์ดํ„ฐ์†Œ์Šค ํ”„๋กœํ† ์ฝœ : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ”ผ์ปค๋ทฐ๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ๋ฉ”์„œ๋“œ ๋ชฉ๋ก (์ฑ„ํƒํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•จ)

UITableViewDataSource

  • ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ 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

UITableViewDelegate

  • 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

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)๋ฅผ ์žฌ์…‹ํŒ… ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

initializer

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()

designatedinitializer

: ์ง€์ •์ƒ์„ฑ์ž ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ(๊ฐ์ฒด)๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๋Š” ์ƒ์„ฑ์ž

  • ํด๋ž˜์Šค์— ๋ฐ˜๋“œ์‹œ 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()

์ž˜๋ชป๋œ ์ด๋‹ˆ์…œ๋ผ์ด์ €

  • ํ”„๋กœํผํ‹ฐ ํ•˜๋‚˜๋ฅผ ์ œ์™ธํ•˜๋ฉด 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()

convenienceinitializer

:ํŽธ์˜์ƒ์„ฑ์ž ์ผ๋ถ€๋งŒ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋‹ค๋ฅธ ์ƒ์„ฑ์ž์—๊ฒŒ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„ ์œ„์ž„

  • ๋ณด์กฐ ์ด๋‹ˆ์…œ๋ผ์ด์ €
  • ์ผ๋ถ€ ํ”„๋กœํผํ‹ฐ๋งŒ ์ดˆ๊ธฐํ™”(๋‹จ๋…์œผ๋กœ ์ดˆ๊ธฐํ™” ๋ถˆ๊ฐ€๋Šฅ)
  • ๋‹ค๋ฅธ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ด์šฉํ•ด์„œ ์ดˆ๊ธฐํ™”(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๋Š” ํ˜ธ์ถœ๋ถˆ๊ฐ€)

failableinitializer

: ์‹คํŒจ๊ฐ€๋Šฅํ•œ ์ƒ์„ฑ์ž: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. ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ ํ•˜์—ฌ ์ฒ˜๋ฆฌ (์ œ์ผ์ข‹์€ ๋ฐฉ๋ฒ•)
    1. ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋Œ€์ž…ํ•˜์—ฌ ํ’€๋ฆฌ๊ฒŒ. (1.์˜ ์ถ•์•ฝ)
    1. !์‚ฌ์šฉ - ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘
    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

SuperClassInitializing

์ž์‹ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ• ๋•Œ๋Š” 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๋ฅผ ํ•ด์ค˜์•ผํ•จ.

initalizer์ƒ์†

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

requiredinitializer

  • ๋ถ€๋ชจํด๋ž˜์Šค์˜ init๋ฉ”์„œ๋“œ
required init() {
}
  • ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฐ˜๋“œ์‹œ required ํ‚ค์›Œ๋“œ๋กœ ์žฌ ์ž‘์„ฑํ•ด์•ผํ•จ

MVC

Model View Controller

  • Model : data&logic
  • View : user inter face
  • Controller : Mediator

๋ชจ๋ธ๊ณผ ๋ทฐ๋Š” ์ ˆ๋Œ€ ์„œ๋กœ ์ง์ ‘์ ์ธ ์ˆ˜์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์ง€ ์•Š๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ ํ•จ. ์žฅ์ ์€ ์–ดํ”Œ์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ๋งŒ๋“ค๋•Œ ๋‹ค๋ฅธ ํ…Œ๋งˆ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์šฉ์ด.


Bundle

๋ฒˆ๋“ค ์˜ค๋ธŒ์ ํŠธ๋Š” ๋ฒˆ๋“ค ๊ตฌ์กฐ, ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์„ค์ •, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜„์ง€ํ™” ๋ฐ ๊ธฐํƒ€ ๊ด€๋ จ ์š”์†Œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ•ญ๋ชฉ์„ ์ฐพ๊ธฐ ์œ„ํ•œ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต. ์•ฑ ๋‚ด๋ถ€, ๋‹ค๋ฅธ ์œ„์น˜์˜ ๋ฒˆ๋“ค์—์„œ ๋ฆฌ์†Œ์Šคํ•  ์ˆ˜ ์žˆ์Œ.

[๋ฒˆ๋“ค๊ฐ์ฒด ์‚ฌ์šฉ์‹œ ์ผ๋ฐ˜์  ํŒจํ„ด]

  • ์›ํ•˜๋Š” ๋ฒˆ๋“ค๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์˜ค๋ธŒ์ ํŠธ ์ž‘์„ฑ.
  • ๋ฒˆ๋“ค ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ž์›์„ ์ฐพ๊ฑฐ๋‚˜ ๋กœ๋“œ
  • ๋‹ค๋ฅธ ์‹œ์Šคํ…œ 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์™€Xib

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์™€API์ฐจ์ด

  • 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๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

[Xcode]

Debugging

  • 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

๋งํฌ : SwiftUI ๋ ˆํผ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™

swiftUI์†Œ๊ฐœ https://developer.apple.com/kr/xcode/swiftui/

ํŠœํ† ๋ฆฌ์–ผ https://developer.apple.com/tutorials/swiftui/tutorials

SwiftUI์™€ Objective-C(UIKit)์ฐจ์ด

  • Objective-C์˜ UIKit๋Š” class ๊ธฐ๋ฐ˜์ž„ , SwiftUI๋Š” struct๊ธฐ๋ฐ˜(๊ตฌ์กฐ์ฒด)
  • iOS. tvOS. macOS - AppKit, watchOS - watchKit ์ฒ˜๋Ÿผ ์•Œ๋งž์€ Kit๋ฅผ ์ด์šฉํ•ด์•ผํ•˜์ง€๋งŒ, SwiftUI๋Š” ๋ชจ๋“  ๊ธฐ์ข… ํ˜ธํ™˜๊ฐ€๋Šฅ.

SwiftUI์‚ฌ์šฉ ๊ธฐ๋ณธ

  • View์™€ body๋กœ ๊ตฌ์„ฑ๋จ. ๊ทธ ์ค‘ body๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ . (some View => ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ทฐ). ๋ทฐ์˜ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ์–ด๋–ค ๊ฒƒ someView.

  • Assets.xcassets(์—์…‹) ์•ฑ ์ถœ์‹œ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€์™€ preview Assets.xcassets(ํ”„๋ฆฌ๋ทฐ์—์…‹) ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€๋กœ ๊ตฌ๋ถ„๋จ.

  • ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ, ํ”„๋ฆฌ๋ทฐ(preview)์ด์šฉ.

  • ๋ฉ”์„œ๋“œ์ฒด์ด๋‹์˜ ํ˜•ํƒœ. ~ (์„ ์–ธ์  ๊ตฌ๋ฌธ) ์˜ˆ์‹œ)

Text(โ€œASDR") 
.Font(.title)
.fintWeight(.balck)
.italic()
  • ์†์„ฑ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ด
  • modifier ๋Š” method์ด์ง€๋งŒ, ์ˆ˜์‹์–ด์™€ ๋น„์Šทํ•œ ์†์„ฑ์„ ๊ฐ€์ง (๋ทฐ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ, ์–ด๋–ค ๋ณ€ํ™”๋ฅผ ๊ฐ€๋ฏธํ•œ ์ƒˆ๋กœ์šด ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ. ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ๊ณ„์† ๋ณ€๊ฒฝํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ. ๋ง์น ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ.)

์‚ฌ์šฉ ์ฝ”๋“œ (์˜ˆ์‹œ: Text)

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)
  }
}

About

๐Ÿƒโ€โ™€๏ธ~ ! ~ You can do Swift ~ ! ~ ๐Ÿ‘๐Ÿคธโ€โ™€๏ธ

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages