iOS/Swift ๋ฌธ๋ฒ•

ํด๋กœ์ € & ํ›„ํ–‰ ํด๋กœ์ €

NelchuPapa 2022. 8. 8. 15:55
๋ฐ˜์‘ํ˜•

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

 

  • ํด๋กœ์ €๋ฅผ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 
  • ํ›„ํ–‰ ํด๋กœ์ € ๋ฐ ๋‹จ์ถ• ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๋“ค์ด๋Š” ๋ฐฉ๋ฒ•

 

 


1. ํด๋กœ์ €๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?๐Ÿค”

 

 

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

์ด ํ•จ์ˆ˜๋Š” ์ด๋ฆ„์ด ์—†์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‚ฌ์‹ค์ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

ํด๋กœ์ €๋Š” ์ค‘๊ด„ํ˜ธ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š” ๋‹ค๋ฅธ๋ง๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋‚˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ด„ํ˜ธ ์™ธ๋ถ€์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

์ผ๋‹จ ํ•™์Šต์„ ํ•˜๋Š” ๊ณผ์ •์—๋„ ๊ทธ๋ ‡๊ณ  ์ •๋ฆฌ๋ฅผ ํ•˜๋Š” ์ค‘์—๋„ ์ •ํ™•ํžˆ 100%์ดํ•ด ํ–ˆ๋‹ค๊ณ  ํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค. 

๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” The Swift Language Guide ์˜ ๊ณต์‹ ๋ฌธ์„œ๋กœ ๋„์›€์„ ๋งŽ์ด ๋ฐ›์•„ ๋ณด์•˜๋‹ค. 

๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ํด๋กœ์ €์— ๋Œ€ํ•ด ํ•™์Šต์„ ํ•˜๊ณ  ๋ณธ๋ก ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž! 

 

https://jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures

 

Closures โ€” The Swift Programming Language (Swift 5.7)

Closures Closures are self-contained blocks of functionality that can be passed around and used in your code. Closures in Swift are similar to blocks in C and Objective-C and to lambdas in other programming languages. Closures can capture and store referen

docs.swift.org

 

ํ•ด๋‹น ๋ฌธ์„œ์—์„œ๋Š” ์ „์—ญํ•จ์ˆ˜, ์ค‘์ฒฉ ํ•จ์ˆ˜, ํด๋กœ์ € ํ‘œํ˜„์‹์˜ ์ •์˜์— ๋Œ€ํ•œ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋จผ์ € ์ดํ•ดํ•˜๊ธฐ๋ณด๋‹ค ํŽธํ–ˆ๋‹ค. 

 

  • ์ „์—ญ ํ•จ์ˆ˜ : ์ด๋ฆ„์ด ์žˆ๊ณ  ๊ฐ’์„ ์บก์ฒ˜ํ•˜์ง€ ์•Š๋Š” ํด๋กœ์ €.
  • ์ค‘์ฒฉ ํ•จ์ˆ˜ : ์ด๋ฆ„์ด ์žˆ๊ณ  ๋‘˜๋Ÿฌ์‹ธ๋Š” ํ•จ์ˆ˜์—์„œ ๊ฐ’์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €.
  • ํด๋กœ์ € ํ‘œํ˜„์‹ : ์ฃผ๋ณ€ ์ปจํ…์ŠคํŠธ์—์„œ ๊ฐ’์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ์ž‘์„ฑ๋œ ์ด๋ฆ„ ์—†๋Š” ํด๋กœ์ €.

 

 

ํด๋กœ์ € ํ‘œํ˜„์‹ ๊ตฌ๋ฌธ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.  

 

 


 

 

2. ํด๋กœ์ € ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ๋ฒ• 

 

์ด์ œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํด๋กœ์ €์— ์ ‘๊ทผํ•ด๋ณด์ž 

 

let sayHello = { (name: String) -> String in
    "Hi \(name)!"
}

 

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” in์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋ณด์ธ๋‹ค. ํด๋กœ์ €์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ์œ ํ˜• ๋ฐ”๋กœ ๋’ค์— ์˜ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์ค‘๊ด„ํ˜ธ ์™ธ๋ถ€์— ์กด์žฌํ–ˆ์ง€๋งŒ ํด๋กœ์ €์—์„œ๋Š” ์•ž์„œ ๋งํ–ˆ๋“ฏ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜์—†๋‹ค. 

 

 

๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ ๋ณด์ž

func getUserData(for id: Int) -> String {
    if id == 1989 {
        return "Taylor Swift"
    } else {
        return "Anonymous"
    }
}

let data: (Int) -> String = getUserData
let user = data(1989)
print(user)

ํ•จ์ˆ˜ getUserData๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์—ฌ์„œ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•จ์ˆ˜์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค ๋•Œ ํ•จ์ˆ˜์˜ ์œ ํ˜•์€ ์™ธ๋ถ€ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์— ๋Œ€ํ•œ for๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ๋ณต์‚ฌ๋ณธ์ธ ํ˜ธ์ถœ๋  ๋•Œ data(for:1989)๊ฐ€ ์•„๋‹ˆ๋ผ data(1989)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋™์ผํ•œ ๊ทœ์น™์œผ๋กœ ๋ชจ๋“  ํด๋กœ์ €์— ์ ์šฉ๋œ๋‹ค. ์•ž์„œ ์ฒ˜์Œ ๋‚˜์™”๋˜ ์˜ˆ์ œ์˜ sayHello๋ฅผ ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ˜ธ์ถœ ํ•ด๋ณด๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ณต์‚ฌํ•  ๋•Œ์™€ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ?? ์™ธ๋ถ€  ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ์—๋งŒ ์ค‘์š”ํ•˜์ง€ ํด๋กœ์ €๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜์˜ ๋ณต์‚ฌ๋ณธ์„ ๋จผ์ € ๊ฐ€์ ธ์˜ฌ ๋•Œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 


3. ํ›„ํ–‰ ํด๋กœ์ € ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 

 

๋งŒ์•ฝ ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๊ฐ€ ์ฝœ๋กœ์ €๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ  ํ•ด๋‹น ํด๋กœ์ €๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ํ›„ํ–‰ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 
func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

 

ํด๋กœ์ €์˜ ์ธ์ž ๊ฐ’ ๋ถ€๋ถ„๊ณผ ๋ฐ˜ํ™˜ ํ˜• ๋ถ€๋ถ„์„ ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ 

someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

์‚ฌ์‹ค์€ ํ•จ์ˆ˜๋ฅผ ๋Œ€๊ด„ํ˜ธ () {}๋กœ ๋ฌถ๋Š” ๊ฒƒ, ์ผ๋ฐ˜์ ์ธ ์ „์—ญ ํ•จ์ˆ˜ ํ˜•ํƒœ๊ฐ€ ์‚ฌ์‹ค์€ ํด๋กœ์ € ํ˜•ํƒœ๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ธ๋ฐ,

์œ„์—์„œ ์–ธ๊ธ‰ํ•˜์˜€๋˜ ์˜ˆ์ œ๋ฅผ ๋ฐ”๋กœ ํ›„ํ–‰ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

someFunctionThatTakesAClosure() {
    // trailing closure's body goes here
}

 

 

 


 

4. ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ๋ฐฉ๋ฒ• 

 

์ด ํŒŒํŠธ๋Š” ์•ž์—์„œ ๋ฐฐ์šด ํ›„ํ–‰ ํด๋กœ์ € ํŒŒํŠธ ๋•Œ๋ฌธ์— ํŠนํžˆ ์ค‘์š”ํ–ˆ๋˜ ๊ธฐ์ˆ ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ ๋ฐฐ์›Œ๋ณด์ž!

 

func makeArray(size: Int, using generator: () -> Int) -> [Int] {
    var numbers = [Int]()

    for _ in 0..<size {
        let newNumber = generator()
        numbers.append(newNumber)
    }

    return numbers
}

๋‹ค์Œ ์˜ˆ์ œ๋Š” ํ•จ์ˆ˜๋ฅผ ์›ํ•˜๋Š” ํŠน์ • ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•ด ์ •์ˆ˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑ ํ•จ์ˆ˜๋กœ ์ž์„ธํžˆ ํ•œ ์ค„์”ฉ ๋œฏ์–ด๋ณด๋ฉด,

 

  1. ํ•จ์ˆ˜ makeArray()๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ •์ˆ˜์˜ ๊ฐœ์ˆ˜์ด๊ณ  ์ •์ˆ˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 
  2. ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. makeArray() ๋‚ด๋ถ€์—์„œ๋Š” ๋นˆ ์ •์ˆ˜ ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“  ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค. 
  4. ๋ฐ˜๋ณต์„ ํ•  ๋•Œ๋งˆ๋‹ค ์šฐ๋ฆฌ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ generater() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๊ฒŒ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

let rolls = makeArray(size: 50) {
    Int.random(in: 1...20)
}

print(rolls)

๊ฒฐ๊ณผ๋กœ๋Š” ์ด์ œ ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์„œ ์ž„์˜์˜ ํฌ๊ธฐ์˜ ์ •์ˆ˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ๋‹ค. 

 

 


learning by repetition

 

Swift๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ณผ์ • ์ค‘์— ํด๋กœ์ € ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์–ด๋ ต๋‹ค๊ณ ๋“ค ํ•˜๋Š”๋ฐ ํ™•์‹คํžˆ ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค...

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€์ˆ˜0