๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 5์ฃผ์ฐจ

๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 5์ฃผ์ฐจ

์ด์ „ ๊ธ€ ๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 4์ฃผ์ฐจ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ.

๐Ÿ‘€ ์˜ค๋Š˜์˜ ํ•  ์ผ

  • ๐Ÿฆ… Swift ๊ฐœ๋… ์ถ”๊ฐ€๊ณต๋ถ€
  • ๐Ÿ‘จโ€๐Ÿ’ป iOS Navigation ๊ณต๋ถ€
  • ๐Ÿ‘จโ€โš–๏ธ ๋ฐฑ์ค€ Online judge ๋ฌธ์ œ ํ’€์ด

๐Ÿฆ… Swift ๊ฐœ๋… ์ถ”๊ฐ€๊ณต๋ถ€

App Development With Swift ์—๋Š” ๋‹จ์ˆœํžˆ Xcode์™€ iOS์•ฑ์˜ ๋นŒ๋“œ์— ๊ด€๋ จ๋œ ์ง€์‹ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Swift์— ๋Œ€ํ•œ ๊ฐœ๋…๋“ค์„ ์ค‘๊ฐ„์ค‘๊ฐ„ ์ฒจ๋ถ€ํ•ด ์•Œ๋ ค์ฃผ๋Š”๋ฐ, ์ด ๋‚ด์šฉ๋“ค์€ ์ด์ „์— Swift ์ฑ…์„ ๋ณด๋ฉฐ ๋น ๋ฅด๊ฒŒ ๊ณต๋ถ€ํ–ˆ์„๋•Œ ๋ณด์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ๋“ค์ด ๊ฝค ๋งŽ์•˜๊ณ , ์ƒ๊ฐ๋ณด๋‹ค ์‹ค์ „์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ๋ถ€๋ถ„์ด ๋งŽ์•„๋ณด์˜€๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ์ฑ…์„ ์ฝ์–ด๋ณด๋ฉฐ Swift๋ฅผ ๋ณต์Šตํ•˜๊ณ , ์ฒ˜์Œ๋ณด๊ฑฐ๋‚˜ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Nil handling

    if let someting = possiblyNil {
        print("not a nil")
    }
    else{
        print("nil")
    }

if let์„ ํ†ตํ•ด์„œ optionalํ•œ ๊ฐ’์„ handlingํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

Nil init

    struct Toddler {
        var name: String
        var monthsOld: Int
    
        init?(name: String, monthsOld: Int){
            if monthsOld < 12 || monthsOld > 36 {
                return nil
            } else {
                self.name = name
                self.monthsOld = monthsOld
            }
        }
    }

์ƒ์„ฑ์ž์— ?๋ฅผ ๋ถ™์—ฌ์„œ ์ƒ์„ฑ์ž๊ฐ€ nil์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์„ฑ์ž์˜ ๋‚ด๋ถ€์—์„œ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ nil์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

Optional chaining

    if let theResidence = person.residence {
        if let theAddress = theResidence.address {
            if let theApartmentNumber = theAddress.apartmentNumber{
                    print(theApartmentNumber)
            }
        }
    }

๋ผ๊ณ  ํ•˜์—ฌ optional์„ unwrapํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ๋‹จ์ˆœํ•˜๊ฒŒ

    if let theApartmentNumber = person.residence?.address?.apartmentNumber {
        print(theApartmentNumber)
    }

๋กœ ํ•ด์ค„์ˆ˜๋„ ์žˆ๋‹ค.

as?

    let pets = allClientAnimals()
    
    for pet in pets {
        if let dog = pet as? Dog {
            walk(dog: dog)
        } else if let cat = pet as? Cat{
            cleanLitterBox(cat: cat)
        } else if let bird = pet as? Bird{
            cleanCage(bird: bird)
        }
    }

๋” ํŠน์ •ํ•œ type์œผ๋กœ downcastํ•  ๋•Œ as?๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

as!

    class SecondViewController : UIViewController{
        var name: [String]?
    }
    
    func prepare(for segue: UIStoryboardSegue, sender: Any?){
        let secondVC = segue.destination as! SecondViewController
        secondVC.names = ["Peter", "Jamie", "Tricia"]
    }

ํŠน์ • type์œผ๋กœ์˜ casting์ด ๋ฌธ์ œ๊ฐ€ ์—†์Œ์ด ํ™•์‹คํ•˜๋ฉด ๊ฐ•์ œ๋กœ as!๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ downcastํ•  ์ˆ˜ ์žˆ๋‹ค.

Any

    var items: [Any] = [5, "bill", 6.7, true]
    if let firstItem = items[0] as? Int{
        print(firstItem + 4)
    }

9

Any๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ญ๋“ ์ง€ ๋“ค์–ด๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. AnyObject.Any๋กœ ๊ฐ์ฒด๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Guard

    func singHappyBirthday(){
        if birthdayIsToday{
            if !invitedGuests.isEmpty{
                if cakeCandleLit{
                    print("Happy Birthday to you!")
                } else{
                    print("The cake's candles haven't been lit.")
                }
            } else {
                print("It's just a family party.")
            }
        } else {
            print("No one has a birthday today.")
        }
    }

if๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์œ„์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์Œ“์ธ ๋กœ์ง์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ๋œ๋‹ค. ๋Œ€์‹  guard๋ฅผ ์“ฐ๊ฒŒ๋˜๋ฉด

    func singHappyBirthday(){
        guard birthdayIsToday else{
            print("No one has a birthday today.")
            return
        }
        
        guard !invitedGuests.isEmpty else{
            print("It's just a family party.")
            return
        }
    
        guard cakeCandleList else{
            print("The cake's candles haven';t been lit.")
            return
        }
    
        print("Happy Birthday to you!")
    }

๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด์งˆ ์ˆ˜ ์žˆ๋‹ค. guard๋Š” ํ•ด๋‹น ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ๋„˜์–ด๊ฐ€๊ณ  ๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฑธ๋ฆฌ๋„๋ก ํ•œ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ control flow๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๊ณ , ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ๋งŽ์ดํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.

Guard let

    if let eggs = goose.eggs {
        print("the goose laid \(eggs.count) eggs.")
    }

๋ผ๊ณ  if let์„ ์‚ฌ์šฉํ•˜๋ฉด if let์˜ ๊ด„ํ˜ธ ์•ˆ์—์„œ๋งŒ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ

    guard let eggs = goose eggse else {return}
    print("the goose laid \(eggs.count) eggs.")

guard let์„ ์‚ฌ์šฉํ•ด ์œ„์™€๊ฐ™์ด ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋ฐ–์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. optionalํ•œ ๊ฐ’์„ unwrapํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    calculateResult(a: 4, b: 8, c: nil)
    
    func calculateResult(a: Int?, b: Int?, c: Int?) -> Int{
        guard let aValue = a else {return 0}
        guard let bValue = b else {result aValue}
        guard let cValue = c else {result bValue}
        return aValue + bValue + cValue
    }

8

a๋Š” 4์ด๋ฏ€๋กœ aValue๊ฐ€ 4๊ฐ€๋˜๊ณ , b๋Š” 8์ด๋ฏ€๋กœ bValue ๋Š” 8์ด๋˜๊ณ , c๊ฐ€ nil์ด๋ฏ€๋กœ bValue๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด 8์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

๐Ÿ˜ณ ๋งํ–ˆ๋‹ค..

iOS์™€ ๋ฐฑ์ค€๋„ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ƒ๊ฐ๋ณด๋‹ค Swift๊ฐœ๋…์„ ๋ณต์Šตํ•˜๋‹ค๋ณด๋‹ˆ ์‹œ๊ฐ„์ด ํ›Œ์ฉ ์ง€๋‚˜๊ฐ€ ๋ฒ„๋ ธ๋‹ค. ์•„์ง Swift์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ณ ์žˆ์Œ์„ ๋А๊ผˆ๋‹ค. Swift๋ฅผ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•ด์„œ ์ดํ›„์—” ๋ฐฑ์ค€๋„ Swift๋กœ ํ’€์–ด๋ณด์•„์•ผ๊ฒ ๋‹ค.

๋‹ค์Œ ๊ธ€ ๐Ÿง‘โ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” 6์ฃผ์ฐจ๋ณด๋Ÿฌ๊ฐ€๊ธฐ.

Share: Twitter Facebook
Seunghun Yang's Picture

About Seunghun Yang

Seunghun is undergraduate student at Computer Science Engineering in CNU(Chungnam National University).

Daejeon, South Korea

Comments