์ฒ˜์Œ์— Swift ๊ณต๋ถ€ํ•  ๋•Œ๋Š” ์ •๋ง ์•„๋ฌด๊ฒƒ๋„ ๋ชฐ๋ผ์„œ, ํž˜๋“ค์—ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. ์ข‹์€ ๊ธฐํšŒ๋กœ ํ•œ๋ฒˆ๋” ์ •๋ฆฌํ•  ์‹œ๊ฐ„์ด ์ƒ๊ฒผ๋‹ค. ๋‹ค์‹œํ•œ๋ฒˆ ์ „์ฒด์ ์œผ๋กœ ํ›‘๋Š” ์‹œ๋ฆฌ์ฆˆ๋ฅผ ๋งŒ๋“ค์–ด๋ณธ๋‹ค. ๋จผ์ €, Swift๊ฐ€ ์–ด๋–ค ์–ธ์–ด์  ํŠน์ง•์„ ๊ฐ–๋Š”์ง€, ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์€ ์–ด๋–ค์ง€ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ ค ํ•œ๋‹ค.

Swift์˜ ํŠน์ง•

  • ๊ฐ•ํƒ€์ž… ์–ธ์–ด
  • let ์‚ฌ์šฉ์„ ๋Š˜๋ ค์•ผ ํ•จ
    • Value ํƒ€์ž…์ด ์กด์žฌ
  • Optional
    • ๊ฐ’์˜ ๋ถ€์žฌ ๊ฐ€๋Šฅ์„ฑ์„ ํ•ญ์ƒ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•จ
  • ๋„ค์ด๋ฐ์— ์‹ ๊ฒฝ ์“ด๋‹ค.
    • ๋ช…ํ™•ํ•œ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
      • remove(x) : x๋ผ๋Š” ๊ฐ’์„ ์ง€์šฐ๋ผ๋Š” ๊ฒƒ์ธ๊ฐ€? x๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ฅผ ์ง€์šฐ๋ผ๋Š” ๊ฒƒ์ธ๊ฐ€?
      • remove(at :x)
    • mutatating/nonmutating ๋ฉ”์†Œ๋“œ ์Œ์„ ์ผ๊ด€๋˜๊ฒŒ ์ด๋ฆ„์„ ์ง€์ •
      • reference๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ ๋™์‚ฌํ˜•
      • return ํ•˜๋Š” ๊ฒฝ์šฐ ed, ing

Constant & Variable

  • let
    • constant
    • ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
  • var
    • variable
  • let ์‚ฌ์šฉ ๊ถŒ์žฅ
    • ๋””๋ฒ„๊น… ์šฉ์ด
      • ํ™•์ธ ํฌ์ธํŠธ ์ค„์–ด๋“ฆ
    • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

Swift์˜ Type

value, reference type์ด ์กด์žฌํ•œ๋‹ค.

||Value Type|Reference Type| |::|:---------|:-------------| |๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€์ž…|

๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋จ

๋ณ„๋„์˜ instance๊ฐ€ ์ƒ์„ฑ

|

reference๊ฐ€ ๋Œ€์ž…๋จ

๋‘ ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ instance ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋จ

| |member๊ฐ’์˜ ๋ณ€๊ฒฝ|ํ•ด๋‹น type์ด var๋กœ ์„ ์–ธ๋˜๋ฉด ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•˜๋‚˜ let์œผ๋กœ ์„ ์–ธ ๋˜๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ.|ํ•ด๋‹น type์ด ๋Œ€์ž…๋œ ์ƒํƒœ์— ์ƒ๊ด€์—†์ด member๊ฐ’์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ| |ํ•ด๋‹น๋˜๋Š” ์š”์†Œ|enum / struct|class / function| |๋Œ€ํ‘œ์ ์ธ ๊ฒƒ|String, Array, Dictionary ๋“ฑ|Class ๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด, Singleton, Manager โ€ฆ|

Value Type

  • Struct, Enum
  • ์„ ์–ธ์‹œ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜/์ƒ์ˆ˜ ์™ธ์— ์ฐธ์กฐ ๋ถˆ๊ฐ€
  • ๋Œ€์ž…๋˜๋Š” ๊ฒฝ์šฐ ๋ณต์‚ฌ๋จ
    • let a = TempStruct()
    • let b = a ๋ผ ํ•  ๊ฒฝ์šฐ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๊ณ  ๋ณต์‚ฌ๋จ
  • argument๋กœ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ ๋ณต์‚ฌ๋จ
  • return ์‹œ ๋ณต์‚ฌ๋จ
  • ์‚ฌ๋ณธ ์ˆ˜์ •ํ•ด๋„ ์›๋ณธ์— ์˜ํ–ฅ์ด ์—†์Œ
  • ์‹ค์ œ ์ฝ”๋“œ ์งค ๋•Œ, Struct๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ’์„ ๋„˜๊ธฐ๋‹ค๊ฐ€ ๋ถ€์ž‘์šฉ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ(Class์˜ ๋™์ž‘ ๊ธฐ๋Œ€ํ•œ ๊ฒฝ์šฐ)
  • Copy On Write
    • ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹˜
    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณต์‚ฌ๋ณธ์˜ ๋ณ€๊ฒฝ ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ•˜์—ฌ ๊ธฐ์กด ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ• ์ง€ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ํŒ๋‹จํ•จ

Reference Type

  • class, function
  • ์„ ์–ธ ์ด์™ธ์— ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ type
  • ๋Œ€์ž…๋˜๋Š” ๊ฒฝ์šฐ ์ฐธ์กฐ๋จ
  • argument๋กœ ๋„˜์–ด๊ฐ€๋„ ์ฐธ์กฐ๋จ
  • return๋˜์–ด๋„ ์ฐธ์กฐ๋จ
  • ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์—์„œ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋“  ์ฐธ์กฐ๋œ ๊ณณ์—์„œ ๋ณ€๊ฒฝ๋จ

Value ํƒ€์ž…์˜ ์žฅ์ 

  • ๋ณดํ†ต์€ Value type์€ stack์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— dereference ๊ณผ์ •์ด ํ•„์š”์—†์Œ

  • dereference

    • reference type์€ stack์— heap์— ์ €์žฅ๋œ ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘๊ธฐ ๋•Œ๋ฌธ์— (์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•จ) ๋‹ค์‹œ heap ๊ณต๊ฐ„์œผ๋กœ ๊ฐ€์„œ ๊ฐ’์„ ์ฝ์–ด์•ผ ํ•จ
    • ๊ฒฐ๊ตญ 2๋ฒˆ ๊ฐ€์•ผํ•œ๋‹ค๋Š” ๋œป
  • ๋”ฐ๋ผ์„œ ๋” ๋น ๋ฆ„

  • Mutability ์ œ์–ด๊ฐ€ ๋” ๊ฐ•๋ ฅํ•จ

  • class๋กœ ๋งŒ๋“ค ๊ฒƒ์„ struct๋กœ ๋งŒ๋“ ๋‹ค๋ฉด, member๊ฐ’๋„ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•จ

    class A {
        var variable: Int
        
        init(variable: Int) {
            self.variable = variable
        }
    }
     
    struct B {
        var variable: Int
    }
     
    let temp1 = A(variable: 10)
    let temp2 = B(variable: 20)
     
    temp1 = A(variable: 20) // Impossible
    temp2 = B(variable: 30) // Impossible
     
    temp1.variable = 100 // Possible
    temp2.variable = 400 // Impossible
  • ๋ณด๋‹ค ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์— ๋งž๋Š” ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅ

Basic Grammar

  • Type Alias
    • ์ƒˆ๋กœ์šด ์ด๋ฆ„ ๋ถ€์—ฌ ๊ฐ€๋Šฅ
    • typealias SampleRate = UInt16

Numbers

  • Integers
    • ํ†ต์ƒ์ ์œผ๋กœ Int, UInt ์‚ฌ์šฉ
      • Int๋Š”โ€ฆ
        • 32Bit Platform: Int32
        • 64Bit Platform: Int64
        • CPU๊ฐ€ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ตœ์†Œ๋‹จ์œ„ ํฌ๊ธฐ
        • ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ์˜ ํฌ๊ธฐ
          • 32bit = 4byte์˜ ์ฃผ์†Œ๊ณต๊ฐ„ ํ‘œํ˜„ ๊ฐ€๋Šฅ
          • 2^32 = 4GB
          • ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ 4GB๊ฐ€ ํ•œ๊ณ„์˜€์Œ
    • ๋ช…ํ™•ํ•˜๊ฒŒ ํฌ๊ธฐ๋ฅผ ์ •ํ•ด์•ผ ํ•˜๋Š” ๊ปด์šฐ
      • Int8, Int16, Int32, Int64
      • UInt8, UInt16, UInt32, UInt64
    • bounds ํ™•์ธ
      • UInt8.min, UInt8.max
  • Floating-Point Numbers
    • Float(32bit)
    • Double(64bit)
  • Type Inference
    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ’ ์œ ์ถ”ํ•ด์คŒ
    • ํ•˜์ง€๋งŒ Type ๋ช…์‹œ์‹œ, ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
    • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ(์†Œํ†ตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ) ๋ช…์‹œํ•ด์•ผ ํ•จ
  • Numeric Literals
    • prefix
      • Dicimal: 123
      • Binary: 0b1001
      • Octal: 0o771
      • Hexadecimal: 0xAC33
    • ์ง€์ˆ˜ ํ‘œํ˜„
      • let a = 3.44e2
      • let b = 2.14e-2
    • Big Number
      • ํฐ ์ˆซ์ž์˜ ๊ฒฝ์šฐ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ค‘๊ฐ„์— _๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
      • let milion = 1_000_000
  • Numeric Type Conversion
    • Swift๋Š” ๊ฐ•ํƒ€์ž… ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— Type์ด ๋‹ค๋ฅผ์‹œ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€
    • Int ๋ณ€์ˆ˜๋ฅผ Double๋กœ ๋ณ€๊ฒฝ์‹œ Double(a)์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•จ
      • ์ด ๋•Œ, ์ด ์ž‘์—…์€ Casting์ด ์•„๋‹˜
      • Double๊ณผ ๊ฐ™์€ ์ž๋ฃŒํ˜•์€ Swift์—์„œ Struct๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , Int๋ฅผ ๋ฐ›์•„ Double ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž„
    • ๊ฐ™์€ Integer(UInt, Int)์—ฌ๋„ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด Conversionํ•ด์•ผ ํ•จ

Booleans

  • 1๊ณผ True๋Š” ๋‹ค๋ฅธ Type์ž„
  • ์—ญ์‹œ ๊ตฌ์กฐ์ฒด์ž„

Tuple

  • ์—ฌ๋Ÿฌ๊ฐœ ๊ฐ’์„ ํ•˜๋‚˜์˜ ๋ณตํ•ฉ ๊ฐ’์œผ๋กœ ํ‘œํ˜„
    let http404Error = (404, "Not Found")
    let (statusCode, message) = http404Error
    let (code, _) = http404Error
     
    let http200 = (code: 200, message: "OK")
    let code = http200.code
    let message = http200.message

Any, AnyObject, nil

  • Any
    • Swift์˜ ๋ชจ๋“  ํƒ€์ž…์„ ์ง€์นญํ•˜๋Š” ํ‚ค์›Œ๋“œ
    • ์ค‘์š”ํ•œ ์ ์€ ์˜ˆ๋ฅผ ๋“ค์–ด Any ํƒ€์ž…์˜ ๋ณ€์ˆ˜์•ˆ์— Doubleํ˜• ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด๋‘์—ˆ๋‹ค ํ•˜๋”๋ผ๋„
    • ๋‹ค๋ฅธ Double ๋ณ€์ˆ˜์— ์ด ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
    • ๊ผญ ํ˜•๋ณ€ํ™˜์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • AnyObject
    • ๋ชจ๋“  ํด๋ž˜์Šค ํƒ€์ž…์„ ์ง€์นญํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
    • ํ”„๋กœํ† ์ฝœ์€ ์ถ”ํ›„์— ์•Œ์•„๋ณด์ž.
    • AnyObject๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๋ฐ›์•„๋จน๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
  • nil
    • โ€˜์—†์Œโ€™์„ ์˜๋ฏธ
    • Any, AnyObject์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค!!!!!!!!!!

Optional

  • ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
  • ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ nil ์‚ฌ์šฉ
  • Explicit Optional
    • let a: Int? = 3
    • ๊ฐ’์„ ์ƒ์ž์•ˆ์— ๋‹ด๋Š” ๋ชจ์–‘
      • ๋น„์–ด์žˆ์„ ์ˆ˜๋„ ๋“ค์–ด์žˆ์„ ์ˆ˜๋„ ์žˆ์Œ
  • Implicit Optional
    • let a: Int! = 3
    • ๊ฐ’์„ ์ƒ์ž์— ๋‹ด์œผ๋‚˜, ๋“ค์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ์ƒํƒœ
    • ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ์—†์„ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ
    • ๊ฐ€๋Šฅํ•˜๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

Unwrapping ๋ฐฉ๋ฒ•

  • ๊ฐ’์ด ์ƒ์ž์•ˆ์— ๋“ค์–ด์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ๊บผ๋‚ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ์Œ
  • Optional Binding
    • ์ƒ์ž๋ฅผ ์—ฌ๋Š” ๋ฐฉ๋ฒ•
    • if let
      • ์กฐ๊ฑด ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ Early Exit์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ
    • guard let
      • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • Force unwrapping
    • ์ƒ์ž๋ฅผ ๋ถ€์ˆ˜๊ณ  ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
    • ๊ฐ’์˜ ์กด์žฌ๊ฐ€ ํ™•์‹คํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—†์„ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ
    • let a = b! + 10

Assert

  • Debugging์„ ์œ„ํ•ด ๋„ฃ๋Š” ๋ฌธ
  • ํŠน์ • ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ ์ž์ฒด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์™€ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•จ
  • ๋ณดํ†ต Test ์ฝ”๋“œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•จ