DEV_Larva

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณธ๋ฌธ

iOS/Swift ๋ฌธ๋ฒ•

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

NelchuPapa 2022. 7. 24. 23:22
๋ฐ˜์‘ํ˜•

๐Ÿง‘‍๐Ÿ’ป์ด๋ฒˆ Swift ์‹œ๊ฐ„์— ๋ฐฐ์›Œ๋ณผ ๊ฒƒ์€  ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป

 

  • ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• 

 


1. ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•

 

ํ•จ์ˆ˜์— ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์—์„œ ํ•จ์ˆ˜๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 

๋•Œ๋กœ๋Š” ์ฝ”๋“œ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ์ง€์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒฝ์šฐ 10๋ฒˆ ์ค‘ 9๋ฒˆ๋งŒ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. 

 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๋” ์•Œ์•„๋ณด์ž.

 

func printTimesTables(for number: Int, end: Int) {
    for i in 1...end {
        print("\(i) x \(number) is \(i * number)")
    }
}

printTimesTables(for: 5, end: 20)

 

 

 

func printTimesTables(for number: Int, end: Int = 12) {
    for i in 1...end {
        print("\(i) x \(number) is \(i * number)")
    }
}

printTimesTables(for: 5, end: 20)
printTimesTables(for: 8)

 

 

์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋“  ๋์ ๊นŒ์ง€์˜ ์ˆซ์ž๋ฅผ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ž„์˜์˜ ๊ณฑ์…ˆํ‘œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ์ด ์ˆซ์ž๋Š” ์›ํ•˜๋Š” ๊ตฌ๊ตฌ๋‹จ์„ ๊ธฐ์ค€์œผ๋กœ ํ•ญ์ƒ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ, ์—”๋“œํฌ์ธํŠธ๋Š” ์ ์ ˆํ•œ ๋””ํดํŠธ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Swift๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ผ๋ถ€ ๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ end๋ฅผ ๊ธฐ๋ณธ๊ฐ’ 12๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด 12๊ฐ€ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

์ด์ œ printTimesTables()๋ฅผ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์›ํ•˜๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•ด ๋‘ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, printTimesTables(for: 8)๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’ 12๊ฐ€ ๋ ๋ถ€๋ถ„์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 


 

 

2. ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

์šฐ๋ฆฐ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋‚œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ฝ์–ด ๋“ค์ผ๋ ค๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ์˜ ์ค‘๋‹จ์œผ๋กœ ์ธํ•œ ๋‹ค์šด๋กœ๋“œ ์‹คํŒจ, ๋“ฑ๋“ฑ ๊ทธ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ๋งŒ๋‚˜๋Š” ์˜ค๋ฅ˜๋Š” ์•„๋งˆ ์ฝ”๋”ฉ ์ค‘์— ๋‹นํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹๊นŒ ์‹ถ๋‹ค. ๐Ÿ™€

 

์˜ค๋ฅ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œ ํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋Œ€์ฒ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ์•Œ์•„์•ผ ํ•œ๋‹ค. 

์ด ์ž‘์—…์—์„œ๋Š” 3๊ฐ€์ง€์˜ ๋‹จ๊ณ„๋กœ ์ด๋ค„์ง„๋‹ค. 

  1. ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜์— ๋Œ€ํ•ด Swift์—๊ฒŒ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ค€๋‹ค.
  2. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  3. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํšŒ์›๊ฐ€์ž…์„ ํ•  ๋•Œ ์ž์ฃผ ๋ณด๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„๋ฅผ ์„ค์ •ํ•  ๋•Œ ๋„ˆ๋ฌด ์งง๊ฑฐ๋‚˜ ๋ช…ํ™•ํ•˜๋‹ค๋ฉด(ํ”ํ•˜๋ฉด) ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น 3๋‹จ๊ณ„๋Š” ์•„๋ž˜์—์„œ ํ•˜๋‚˜์”ฉ ๊นŠ๊ฒŒ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•˜์ž.

 

 

 

1๋‹จ๊ณ„. ์˜ค๋ฅ˜ ์ •์˜

enum PasswordError: Error {
    case short, obvious
}

 

๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด์ž. ์ด๋Š” Swift์˜ ๊ธฐ์กด ์˜ค๋ฅ˜ ์œ ํ˜•์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒˆ๋กœ์šด ์—ด๊ฑฐํ˜•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. 

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋œฌ๋‹ค. ์งง๊ฑฐ๋‚˜, ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ์ •์˜๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ •์˜์ผ ๋ฟ ์—ฌ๊ธฐ์„œ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

 

 

 

2๋‹จ๊ณ„. ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•  ํ•จ์ˆ˜ ์ž‘์„ฑ

 

func checkPassword(_ password: String) throws -> String {
    if password.count < 5 {
        throw PasswordError.short
    }

    if password == "12345" {
        throw PasswordError.obvious
    }

    if password.count < 8 {
        return "์ ๋‹นํ•ด์š”."
    } else if password.count < 10 {
        return "์ข‹์•„์š”."
    } else {
        return "๋งค์šฐ ์ข‹์•„์š”."
    }
}

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ์ด์ œ ์œ„์˜ ์˜ค๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ค๋ฅ˜๋Š” ์ผ๋‹จ ํŠธ๋ฆฌ๊ฑฐ ๋˜๋ฉด ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ „์†ก๋˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒ๋œ๋‹ค. 

 

์ด ๊ฒฝ์šฐ ์•”ํ˜ธ์˜ ๊ฐ•๋„๋ฅผ ํ™•์ธํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์•”ํ˜ธ๊ฐ€ 5์ž ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ž˜ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ ๋ฐ”๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ฒ ์ง€๋งŒ ๋‚˜๋จธ์ง€์˜ ๊ฒฝ์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋„˜์–ด๊ฐ„๋‹ค. ๊ทธ์ค‘์—์„œ๋„ ๊ฐ ๊ธฐ์ค€์— ๋งž์ถฐ ์ ๋‹นํ•˜๋‹ค, ์ข‹๋‹ค, ๋งค์šฐ ์ข‹๋‹ค์™€ ๊ฐ™์ด ๋“ฑ๊ธ‰์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

์—ฌ๊ธฐ์„œ ์ค‘๊ฐ„์— throws๋ผ๋Š” ๊ฒŒ ๋ณด์ด๋Š”๋ฐ ์ด๊ฒƒ์€ ํ•จ์ˆ˜๊ฐ€ ์ง์ ‘ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ ๋„ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋ฐ˜ํ™˜ ์œ ํ˜•์ธ String ์•ž์— throws -> String๋ผ๊ณ  ํ‘œ์‹œ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. 

 

๊ทธ๋ž˜์„œ ์ด ์ž‘์—…์—์„œ๋Š” ์˜ค๋ฅ˜๋ฅผ ํˆฌ์ฒ™ํ•˜๋Š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์—ฌ๊ธฐ์„œ ํˆฌ์ฒ™์€ ํ”Œ๋ž˜๊ทธ๋กœ ๋ณด์•„๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค. 

 

 

 

 

 

3. ๊ธฐ๋Šฅ ์‹คํ–‰ ๋ฐ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌ 

 

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ์•ž์„œ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ณ  ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 

Swiftํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์‹œ ํ•œ๋ฒˆ 3๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ

  1. do๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ๋ธ”๋ก์„ ์‹œ์ž‘. 
  2. try๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋˜์ง€๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
  3. catch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋˜์ง„ ์˜ค๋ฅ˜๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค. 

 

let string = "12345"

do {
    let result = try checkPassword(string)
    print("Password rating: \(result)")
} catch {
    print("There was an error.")
}

 

checkPassword() ๊ธฐ๋Šฅ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋ฉด ๊ฐ’์ด ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•”ํ˜ธ ๋“ฑ๊ธ‰ ๋ฉ”์‹œ์ง€๊ฐ€ ์ธ์‡„๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์‹คํ–‰์ด ์ฆ‰์‹œ catch ๋ธ”๋ก์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.


try๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” do ๋ธ”๋ก ์•ˆ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ catch ๋ธ”๋ก์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” try!๋กœ ์ž‘์„ฑ๋œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์‹คํ–‰ ๋ฐ catch๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œํ•œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋“œ๋ฌผ๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ์žก์„ ๋•Œ๋Š” ํ•ญ์ƒ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” catch ๋ธ”๋ก์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ํŠน์ • ์˜ค๋ฅ˜๋„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

let string = "12345"

do {
    let result = try checkPassword(string)
    print("Password rating: \(result)")
} catch PasswordError.short {
    print("Please use a longer password.")
} catch PasswordError.obvious {
    print("I have the same combination on my luggage!")
} catch {
    print("There was an error.")
}

 

 


์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๊ทธ๋Ÿฐ๋ฐ Apple์—์„œ๋Š” ๋ฐœ์ƒํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์˜ค๋ฅ˜๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์˜๋ฏธ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Swift๋Š” ์บ์น˜ ๋ธ”๋ก ๋‚ด๋ถ€์— ์ž๋™์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์˜ค๋ฅ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ error.localizedDescription์„ ์ฝ์œผ๋ฉด ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

learning by repetition

 

https://www.hackingwithswift.com/100/swiftui/8

 

Day 8 – 100 Days of SwiftUI

Follow the 100 Days of SwiftUI and learn to build apps for free.

www.hackingwithswift.com

 

๋ฐ˜์‘ํ˜•

'iOS > Swift ๋ฌธ๋ฒ•' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๊ตฌ์กฐ์ฒด  (0) 2022.08.14
ํด๋กœ์ € & ํ›„ํ–‰ ํด๋กœ์ €  (0) 2022.08.08
ํ•จ์ˆ˜  (0) 2022.07.23
๋ฐ˜๋ณต๋ฌธ  (0) 2022.07.15
์กฐ๊ฑด๋ฌธ & ์‚ผํ•ญ ์—ฐ์‚ฐ์ž  (0) 2022.07.14