Closure - ehrldyd15/Swift_Skills GitHub Wiki

ํด๋กœ์ €(Closure)๋ž€?

  • ํด๋กœ์ €๋Š” ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ ์•ˆ์—์„œ ์ „๋‹ฌ๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ์ง์„ ๊ฐ€์ง„ ์ค‘๊ด„ํ˜ธโ€œ{}โ€๋กœ ๊ตฌ๋ถ„๋œ ์ฝ”๋“œ์˜ ๋ธ”๋Ÿญ์ด๋ฉฐ, ์ผ๊ธ‰ ๊ฐ์ฒด์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ผ๊ธ‰ ๊ฐ์ฒด๋Š” ์ „๋‹ฌ ์ธ์ž๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๋ณ€์ˆ˜/์ƒ์ˆ˜ ๋“ฑ์œผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

  • ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค.

  • ํ•จ์ˆ˜๋Š” ํด๋กœ์ €์˜ ํ•œ ํ˜•ํƒœ๋กœ, ์ด๋ฆ„์ด ์žˆ๋Š” ํด๋กœ์ €์ด๋‹ค.

ํด๋กœ์ € ํ‘œํ˜„

let reverseNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2})

์œ„์˜ ํ˜•ํƒœ์˜ ํด๋กœ์ €๋Š” ํ•จ์ˆ˜๋กœ ๋”ฐ๋กœ ์ •์˜๋œ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์ธ๋ผ์ธ ํด๋กœ์ €๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํด๋กœ์ € ์ถ•์•ฝ

  1. ํƒ€์ž… ์ƒ๋žต

์œ„์˜ ์˜ˆ์ œ์—์„œ sorted(by:)์˜ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ (string, string) -> Bool ํƒ€์ž…์˜ ์ธ์ž๊ฐ€ ๋“ค์–ด์™€์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

ํด๋กœ์ €์—์„œ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋‹ค.

let reverseNames = names.sorted(by: {s1, s2 in return s1 > s2})

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค๊ณ  ๊ฐ€์‹œ์„ฑ์ด ์—†์–ด์„œ ํƒ€์ž… ์ •๋„๋Š” ๋ช…์‹œํ•˜๋Š”๊ฒƒ์ด ์ข‹์Œ

  1. ๋ฐ˜ํ™˜ํƒ€์ž… ์ƒ๋žต

๋ฐ˜ํ™˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

let reverseNames = names.sorted(by: {s1, s2 in s1 > s2})

  1. ์ธ์ž์ด๋ฆ„ ์ƒ๋žต

์ธ์ž ๊ฐ’์„ ์ถ•์•ฝํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (์ธ์ž์˜ ํ‘œ๊ธฐ๋Š” $0๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ)

let reversedNames = names.sorted(by: { $0 > $1 })
  1. ์—ฐ์‚ฐ์ž ๋ฉ”์†Œ๋“œ

์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์€ ์—ฐ์‚ฐ์ž๋งŒ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

let reversedNames = names.sorted(by: > )
  1. ํ›„ํ–‰ํด๋กœ์ €

์ธ์ž๋กœ ํด๋กœ์ €๋ฅผ ๋„ฃ๊ธฐ๊ฐ€ ๊ธธ๋‹ค๋ฉด ํ›„ํ–‰ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์˜ ๋’ค์— ํ‘œํ˜„ ๊ฐ€๋Šฅ

let reversedNames = names.sorted() { $0 > $1 }

ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž๊ฐ€ ํด๋กœ์ €์ด๊ณ , ํ›„ํ–‰ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ด„ํ˜ธ"()"๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

let reversedNames = names.sorted { $0 > $1 }
let reversedNames = names.sorted { (s1: String, s2: String) -> Bool in return s1 > s2 }

Value ์บก์ณ

ํด๋กœ์ €๋Š” ํŠน์ • ๋ฌธ๋งฅ์˜ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๊ฐ’์„ ์บ ์ณํ•  ์ˆ˜ ์žˆ๋‹ค.

์›๋ณธ ๊ฐ’์ด ์—†์–ด์ ธ๋„ ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ๊ทธ ๊ฐ’์„ ํ™œ์šฉ ๊ฐ€๋Šฅํ•จ

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    
    func incrementer() -> Int {
        runningTotal += amount
        
        return runningTotal
    }
    
    return incrementer
}

let plusTen = makeIncrementer(forIncrement: 10)
let plusSeven = makeIncrementer(forIncrement: 7)

// ํ•จ์ˆ˜๊ฐ€ ๊ฐ๊ธฐ ์‹คํ–‰๋˜์–ด๋„ ์‹ค์ œ๋กœ๋Š” ๋ณ€์ˆ˜ runnigTotal๊ณผ amount๊ฐ€ ์บก์ณ๋˜์„œ ๊ทธ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„์ ๋œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง„๋‹ค.
let plusedTen = plusTen() // 10
let plusedTen2 = plusTen() // 20

// ๋‹ค๋ฅธ ํด๋กœ์ €์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์œ ์˜ ์ €์žฅ์†Œ์— runningTotal๊ณผ amount๋ฅผ ์บก์ณํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
let plusedSeven = plusSeven() // 7
let plusedSeven2 = plusSeven() // 14
  1. plusTen, plusSeven์ด ์ƒ์ˆ˜์ด์ง€๋งŒ runningTotal์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋Š” ํด๋กœ์ €๊ฐ€ ์ฐธ์กฐํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ํ•จ์ˆ˜์™€ ํด๋กœ์ €๋ฅผ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ ์‹ค์ œ๋กœ๋Š” ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜์— ํ•ด๋‹น ํ•จ์ˆ˜๋‚˜ ํด๋กœ์ €์˜ ์ฐธ์กฐ๊ฐ€ ํ• ๋‹น๋œ๋‹ค.

    ๋งŒ์•ฝ ํ•œ ํด๋กœ์ €๋ฅผ ๋‘ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋ฉด ๊ทธ ๋‘ ์ƒ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋Š” ๊ฐ™์€ ํด๋กœ์ €๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ฒŒ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  2. ์ตœ์ ํ™”๋ฅผ ์ด์œ ๋กœ Swift๋Š” ๊ทธ ๊ฐ’์ด ํด๋กœ์ €์— ์˜ํ•ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์„ ์บก์ณํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.

  3. ๋˜ํ•œ Swift๋Š” ๋ณ€์ˆ˜๋ฅผ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    ๋งŒ์•ฝ ํด๋กœ์ €๋ฅผ ์–ด๋–ค ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋กœ ํ• ๋‹นํ•˜๊ณ  ๊ทธ ํด๋กœ์ €๊ฐ€ ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์บก์ณํ•˜๋ฉด ๊ฐ•ํ•œ ์ˆœํ™˜ ์ฐธ์กฐ์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

    ์ฆ‰, ์ธ์Šคํ„ด์Šค์˜ ์‚ฌ์šฉ์ด ๋๋‚˜๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ swift๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์บก์ณ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Escaping Closure

ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์‹คํ–‰๋˜๋Š”๊ฒƒ(ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ๊ฒƒ)์„ Escapeํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž… ์•ž์— @excaping์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ completionHandler(์™„๋ฃŒ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ)๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋กœ์ €์˜ ๊ฒฝ์šฐ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

์ผ๋ฐ˜ ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์‚ด์•„์žˆ๋Š” ๊ฒƒ์€ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜์— ๊ฐ€์ ธ์™€์„œ ๊ฐ’์„ ์ฃผ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ„์ด ์—†์ง€๋งŒ,

ํด๋กœ์ €์˜ Escaping์€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ๋งˆ๋ฌด๋ฆฌ๋œ ์ƒํƒœ์—์„œ๋งŒ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.

์ฆ‰, ์ด๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•จ์ˆ˜ ์‚ฌ์ด์— ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
  completionHandlers.append(completionHandler)
}

์œ„ ํ•จ์ˆ˜์—์„œ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ completionHandler๋Š” someFunctionWithEscapingClosureํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ ๋œ๋‹ค.

๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ณ  ์‹คํ–‰๋˜๋Š” ํด๋กœ์ €์— @escapingํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

@escaping์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋กœ์ €์—์„œ๋Š” self๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•ด์•ผํ•œ๋‹ค.

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()    // ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋๋‚˜๋Š” ํด๋กœ์ €
}

class SomeClass {
    var x = 10
    
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 } // ๋ช…์‹œ์ ์œผ๋กœ self๋ฅผ ์ ์–ด์ค˜์•ผ ํ•œ๋‹ค.
        someFunctionWithNonescapingClosure { x = 200 }
    }
}

let instance = SomeClass()

instance.doSomething()
print(instance.x) // 200

completionHandlers.first?()
print(instance.x) // 100

AutoClosure

์ž๋™ ํด๋กœ์ €๋Š” ์ธ์ž ๊ฐ’์ด ์—†์œผ๋ฉฐ ํŠน์ • ํ‘œํ˜„์„ ๊ฐ์‹ธ์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ „๋‹ฌ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋กœ์ €๋ฅผ ๋งํ•œ๋‹ค.

์ž๋™ ํด๋กœ์ €๋Š” ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง€ ์‹ค์ œ ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰, ์‹ค์ œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ• ๋•Œ ํ˜ธ์ถœ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ์ด ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๋‹ค.

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
print(customersInLine.count) // 5

let customerProvider = { customersInLine.remove(at: 0) } // ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์ง€๋‚˜๋„ count๊ฐ€ ์ค„์ง€ ์•Š๋Š”๋‹ค.
print(customersInLine.count) // 5

// customerProvider๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„๋•Œ๋งŒ ๋™์ž‘
print("Now serving \(customerProvider())!") // "Now serving Chris!"
print(customersInLine.count) // 4

์ž๋™ํด๋กœ์ €๋ฅผ ํ•จ์ˆ˜์˜ ์ธ์ž ๊ฐ’์œผ๋กœ ๋„ฃ๋Š” ์˜ˆ์ œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: () -> String) {
    print("Now serving \(customerProvider())!")
}

serve(customer: { customersInLine.remove(at: 0) } ) // "Now serving Alex!"

Serve ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ () -> String(์ธ์ž๊ฐ€ ์—†๊ณ , Strign์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋กœ์ €)๋ฅผ ๊ฐ€์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ serve(customer: { customersInLine.remove(at: 0) } )์™€ ๊ฐ™์ด ํด๋กœ์ €๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง์ ‘ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

@autoclosure ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// customersInLine is ["Ewa", "Barry", "Daniella"]
func serve(customer customerProvider: @autoclosure () -> String) {
    print("Now serving \(customerProvider())!")
}

serve(customer: customersInLine.remove(at: 0)) // "Now serving Ewa!"

@autoclosure ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ž„์œผ๋กœ์จ ์ธ์ž ๊ฐ’์€ ์ž๋™์œผ๋กœ ํด๋กœ์ €๋กœ ๋ณ€ํ™˜ ๋œ๋‹ค. ๊ทธ๋กœ์ธํ•ด ์ธ์ž์— ์ค‘๊ด„ํ˜ธ๋ฅผ ๋„ฃ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์ž๋™ํด๋กœ์ €๋ฅผ ๋„ˆ๋ฌด ๋‚จ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋“œ์‹œ autoclosure๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ถ„๋ช…ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

@autoclosure๋Š” @escaping๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

var customersInLine = ["Barry", "Daniella"]
var customerProviders: [() -> String] = [] //  ํด๋กœ์ €๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ์„ ์–ธ

func collectCustomerProviders(_ customerProvider: @autoclosure @escaping () -> String) {
    customerProviders.append(customerProvider)
} // ํด๋กœ์ €๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๊ทธ ํด๋กœ์ €๋ฅผ customerProviders ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ

collectCustomerProviders(customersInLine.remove(at: 0)) // ํด๋กœ์ €๋ฅผ customerProviders ๋ฐฐ์—ด์— ์ถ”๊ฐ€
collectCustomerProviders(customersInLine.remove(at: 0))

print("Collected \(customerProviders.count) closures.") // 2๊ฐœ์˜ ํด๋กœ์ €๊ฐ€ ์ถ”๊ฐ€ ๋จ
// Prints "Collected 2 closures."

for customerProvider in customerProviders {
    print("Now serving \(customerProvider())!") // ํด๋กœ์ €๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅ
}
// Prints "Now serving Barry!"
// Prints "Now serving Daniella!"

๊ณ ์ฐจ ํ•จ์ˆ˜

ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜

1. map

์ฝœ๋ ‰์…˜ ๋‚ด๋ถ€์˜ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ˜•ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ฝœ๋ ‰์…˜ ์ƒ์„ฑ

let numbers: [Int] = [2,8,15]
var newNumbers: [Int] = numbers.map { $0 + 1 } // [3, 9, 16]

2. fillter

์ฝœ๋ ‰์…˜ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฑด์— ๋งž๋Š” ์ƒˆ๋กœ์šด ์ฝœ๋ ‰์…˜์œผ๋กœ ์ƒ์„ฑ

let numbers: [Int] = [2,8,15]
var newNumbers: [Int] = numbers.filter { $0 % 2 == 0} // [2, 8]

3. reduce

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ(ex. Element๋“ค์˜ ์ดํ•ฉ, ์ด๊ณฑ ๋“ฑ)

let numbers: [Int] = [2,8,15]
// ์ดˆ๊ธฐ๊ฐ’์ด 3์— ์ •์ˆ˜ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์„ ๋”ํ•œ๋‹ค.
var sum: Int = numbers.reduce(3) { $0 + $1 } // 28

์ฐธ๊ณ ์ž๋ฃŒ

https://medium.com/@jgj455/%EC%98%A4%EB%8A%98%EC%9D%98-swift-%EC%83%81%EC%8B%9D-closure-aa401f76b7ce