๐Ÿ’ก assert ํ•จ์ˆ˜

ํŠน์ •v์กฐ๊ฑด์„ ์ฒดํฌํ•˜๊ณ  ์กฐ๊ฑด์ด ์„ฑ๋ฆฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜



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

var someInt: Int = 0
assert(someInt == 0, "someInt != 0")
// ์กฐ๊ฑด (someInt == 0)์— ๋ถ€ํ•ฉํ•˜๋ฉด ์ง€๋‚˜๊ฐ€๊ธฐ
// ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด -> (๋™์ž‘ ์ค‘์ง€) Assertion failed: someInt != 0 

someInt = 1
// assertion failed: someInt != 0: file guard_assert.swift, line 26

func functionWithAssert(age: Int?) {

    assert(age != nil, "age == nil")

    assert((age! >= 0) && (age! <= 130), "๋‚˜์ด๊ฐ’ ์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
    print("๋‹น์‹ ์˜ ๋‚˜์ด๋Š” \(age!)์„ธ์ž…๋‹ˆ๋‹ค")
}

functionWithAssert(age: 50)
//functionWithAssert(age: -1) // ๋™์ž‘ ์ค‘์ง€, ๊ฒ€์ฆ ์‹คํŒจ
//functionWithAssert(age: nil) // ๋™์ž‘ ์ค‘์ง€, ๊ฒ€์ฆ ์‹คํŒจ


๐Ÿ’ก guard ๊ตฌ๋ฌธ

๋ฌธ๋ฒ•
guard ์กฐ๊ฑด else {์กฐ๊ฑด์ด false์ผ ๋•Œ ์‹คํ–‰๋  ๊ตฌ๋ฌธ}


  • guard ๊ตฌ๋ฌธ์˜ ํ•ต์‹ฌ์€ Early EXIT (๋น ๋ฅธ ์ข…๋ฃŒ)

if ์กฐ๊ฑด๋ฌธ๊ณผ ๋น„๊ตํ•ด๋ณธ๋‹ค๋ฉด, if๋ฌธ์€ โ€˜(์กฐ๊ฑด)์ด๋ฉด (code)ํ•ด๋ผโ€™์˜ ์‹คํ–‰๊ตฌ๋ฌธ์ด์ง€๋งŒ, guard๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ โ€˜(์กฐ๊ฑด)์ด ์•„๋‹ˆ๋ฉด ๋๋‚ด๋ผโ€™


  • ๋””๋ฒ„๊น… ๋ชจ๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋–ค ์กฐ๊ฑด์—์„œ๋„ ๋™์ž‘ ๊ฐ€๋Šฅ
  • guard์˜ else ๋ธ”๋Ÿญ ๋‚ด๋ถ€์—๋Š” _ํŠน์ • ์ฝ”๋“œ๋ธ”๋Ÿญ์„ ์ข…๋ฃŒํ•˜๋Š” ์ง€์‹œ์–ด(return, break, continue, throw ๋“ฑ)_๊ฐ€ ๊ผญ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋‹จ์ˆœ ์กฐ๊ฑด ํŒ๋‹จ ํ›„ ๋น ๋ฅด๊ฒŒ ์ข…๋ฃŒํ•  ๋–„๋„ ์šฉ์ด

guard let ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ

func functionWithGuard(age: Int?) {

    guard let unwrappedAge = age, // guard let์„ ํ†ตํ•ด ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ
    // age๊ฐ€ nil์ผ ๊ฒฝ์šฐ ์‹คํ–‰ X -> ์ข…๋ฃŒ
        unwrappedAge < 130,
        unwrappedAge >= 0 else {
        print("๋‚˜์ด๊ฐ’ ์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
        return
    }
    // ์กฐ๊ฑด 1 = unwrappedAge < 130, ์กฐ๊ฑด 2 = unwrappedAge >= 0
    // ์กฐ๊ฑด๊ณผ ๋งž์ง€ ์•Š์„ ๊ฒฝ์šฐ "๋‚˜์ด๊ฐ’ ์ž…๋ ฅ์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ์ถœ๋ ฅ -> ์ข…๋ฃŒ

    print("๋‹น์‹ ์˜ ๋‚˜์ด๋Š” \(unwrappedAge)์„ธ์ž…๋‹ˆ๋‹ค")
    // guard๊ตฌ๋ฌธ์„ ํ†ต๊ณผํ–ˆ์„ ๊ฒฝ์šฐ ๋‹น์‹ ์˜ ๋‚˜์ด๋Š” OO์„ธ์ž…๋‹ˆ๋‹ค ์ถœ๋ ฅ
}

  • if-let ๊ตฌ๋ฌธ๊ณผ ๋‹ค๋ฅด๊ฒŒ, else๋ฌธ ์ƒ๋žต ๋ถˆ๊ฐ€๋Šฅ
  • ์ œ์–ด๋ฌธ ์ „ํ™˜ ๋ช…๋ น์–ด ๋ฐ˜๋“œ์‹œ ํ•„์š”
  • ์š”๊ตฌ์‚ฌํ•ญ๋งŒ์„ ๋ฐ˜์˜ํ•ด์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ guard let์ด ์œ ์šฉ
  • ํ•จ์ˆ˜ ์ „์ฒด์—์„œ optional๋กœ ์ถ”์ถœ๋œ ์ƒ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ


๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ์˜ guard ๊ตฌ๋ฌธ

var count = 1
while true {
    guard count < 3 else {
        break
    }
    print(count)
    count += 1
}
// 1
// 2


Dictionary ํ™œ์šฉ

func someFunction(info: [String: Any]) {
    guard let name = info["name"] as? String else {
        return
    }

    guard let age = info["age"] as? Int, age >= 0 else {
        return
    }

    print("\(name): \(age)")

}

someFunction(info: ["name": "jenny", "age": "25"]) // ์ข…๋ฃŒ
someFunction(info: ["name": "jisoo"]) // ์ข…๋ฃŒ 
someFunction(info: ["name": "doris", "age": 25]) // doris: 25