πŸ“± iOS/-- Swift 5

(Swift) - ν΄λ‘œμ € (Closure)

Newmon 2021. 8. 14. 00:06

ν΄λ‘œμ €(Closure) λž€?

κ°„λ‹¨ν•˜κ²Œ λ§ν•˜λ©΄ ν΄λ‘œμ €λŠ” 일정 κΈ°λŠ₯을 ν•˜λŠ” μ½”λ“œλ₯Ό { } 둜 λͺ¨μ•„놓은것을 λ§ν•œλ‹€. 그리고 일반적인 func 둜 μ„ μ–Έλ˜λŠ” ν•¨μˆ˜μ˜ μƒμœ„κ°œλ…μ΄ ν΄λ‘œμ €μ΄λ‹€.

μ™œ ν΄λ‘œμ €λΌκ³  ν•˜μ§€?

ν΄λ‘œμ €λŠ” λ³€μˆ˜, μƒμˆ˜κ°€ μ„ μ–Έλœ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°λ₯Ό 캑쳐(μ €μž₯) ν•  수 μžˆλŠ”λ° 이걸 ν΄λ‘œμ§•μ΄λΌκ³  ν•˜λ©° κ·Έλž˜μ„œ ν΄λ‘œμ €λΌκ³  μ΄λ¦„λΆ™μ—¬μ‘Œλ‹€.

ν΄λ‘œμ €λ₯Ό μ™œ μ“°λ‚˜?

μŠ€μœ„ν”„νŠΈλŠ” ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λΌκ³  ν•˜λŠ”λ°, μ΄λŸ¬ν•œ μŠ€νƒ€μΌμ— ν΄λ‘œμ €κ°€ μ€‘μš”ν•œ 역할을 ν•œλ‹€. ν΄λ‘œμ €λ₯Ό μ œλ„€λ¦­, ν”„λ‘œν† μ½œ, λͺ¨λ‚˜λ“œμ™€ ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄μ„œ μŠ€μœ„ν”„νŠΈλŠ” 더 κ°•λ ₯ν•œ μ–Έμ–΄κ°€ 될 μˆ˜μžˆλ‹€.

ν΄λ‘œμ €μ˜ ν˜•νƒœ(μ’…λ₯˜)

  1. 이름이 있고, 값을 μΊ‘μ³ν•˜μ§€ μ•Šκ³ , μ „μ—­ν•¨μˆ˜μ˜ ν˜•νƒœ
  2. 이름이 있고, λ‹€λ₯Έ ν•¨μˆ˜μ˜ 값을 μΊ‘μ³ν•˜λŠ” μ€‘μ²©λœ(nested) ν•¨μˆ˜ ν˜•νƒœ
  3. 이름 μ—†κ³ , μ£Όλ³€ context에 λ”°λΌμ„œ 값을 μΊ‘μ³ν• μˆ˜ μžˆλŠ” μΆ•μ•½ ν•¨μˆ˜ν˜•νƒœ.

ν΄λ‘œμ €μ˜ ν‘œν˜„λ°©λ²•

 

μ™„μ „ν•˜κ²Œ λ™μΉ˜μΈ μ½”λ“œλΌλ„, ν΄λ‘œμ €λŠ” ν‘œν˜„λ°©λ²•μ΄ μ—¬λŸ¬κ°€μ§€μ΄κΈ° λ•Œλ¬Έμ— μ–΄λ ΅κ²Œ λŠκ»΄μ§€λŠ”κ²ƒκ°™λ‹€.

  1. parameter의 νƒ€μž…, λ°˜ν™˜ κ°’μ˜ νƒ€μž…μ„ μƒλž΅ν•  수 μžˆλ‹€. (swiftλŠ” νƒ€μž… 좔둠이 κ°€λŠ₯ν•˜λ―€λ‘œ)
  2. ν΄λ‘œμ € λΈ”λŸ­ μ•ˆμ— μ½”λ“œκ°€ ν•œμ€„μ΄λΌλ©΄, μ•”μ‹œμ μœΌλ‘œ 이λ₯Ό λ°˜ν™˜κ°’ μ²˜λ¦¬ν•œλ‹€.
  3. μΆ•μ•½λœ argument name 을 μ‚¬μš©ν•  수 μžˆλ‹€. ($0... $1... λ“±μœΌλ‘œ μ‚¬μš©ν•˜λŠ”κ²ƒ)
  4. ν›„ν–‰ ν΄λ‘œμ €(trailing closure) 문법을 μ‚¬μš©ν•  수 μžˆλ‹€. 

 

 

a * b λ₯Ό λ°˜ν™˜ν•˜λŠ” ν΄λ‘œμ €

μ•„λž˜ 3개의 ν΄λ‘œμ €λŠ” λͺ¨λ‘ 같은 μ½”λ“œμ΄λ‹€.

var multiply: (Int, Int) -> Int = { (a: Int, b:Int) -> Int in
    return a * b
}

/// - νŒŒλΌλ―Έν„°(λ§€κ°œλ³€μˆ˜)의 νƒ€μž… μ‚­μ œ κ°€λŠ₯
var multiply2: (Int, Int) -> Int = { (a, b) -> Int in
    return a * b
}

// return ν‚€μ›Œλ“œ μ‚­μ œκ°€λŠ₯ + νŒŒλΌλ―Έν„°(λ§€κ°œλ³€μˆ˜) μ‚­μ œ κ°€λŠ₯
var multiply3: (Int, Int) -> Int = {$0 * $1}

$0, $1 은 각각 a,bλ₯Ό μ˜λ―Έν•˜λ©° μ΄λ ‡κ²Œ ν‘œν˜„ν•˜λŠ” 것을 shorhand argumentλΌκ³ ν•œλ‹€.

 

ν•¨μˆ˜κ°€ ν΄λ‘œμ €λ₯Ό argument둜 λ°›λŠ”μƒν™© - λ‹€μ–‘ν•œ ν™œμš©μ΄ κ°€λŠ₯

func operateTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
    let result = operation(a,b)
    return result
}

var add: (Int, Int) -> Int = { a,b in
    return a + b
}

operateTwoNum(a: 4, b: 9, operation: multiply)  // multyplyλ₯Ό λ„£μœΌλ©΄ κ³±ν•˜κΈ°
operateTwoNum(a: 4, b: 9, operation: add) // add ν΄λ‘œμ €λ₯Ό λ„£μ–΄ λ”ν•˜κΈ°
operateTwoNum(a: 4, b: 9 ){ a, b in // μ•„κ·œλ¨ΌνŠΈ λΈ”λŸ­μ— ν΄λ‘œμ €λ₯Ό 직접 κ΅¬ν˜„ν•΄λ„ λœλ‹€.
    return a - b
}

 

typealias와 같이 μ‚¬μš©ν•˜λŠ” ν΄λ‘œμ €

let c = {(str:String)->String in
    return "Hello \(str)"
}

typealias MyType = (String) -> String

func perform(closure: MyType){
    print(closure("iOS"))
}

perform(closure: c) // closure에 cλ₯Ό 전달

 

fucking closure syntax

Url은 ν™”λ‚˜μžˆμ§€λ§Œ 가보면 λ‹€μ–‘ν•œ ν΄λ‘œμ € ν˜•νƒœκ°€ λ‚˜μ˜¨λ‹€.

https://fuckingclosuresyntax.com/

 

How Do I Declare a Closure in Swift?

As a variable: var closureName: (ParameterTypes) -> ReturnType = { ... } As an optional variable: var closureName: ((ParameterTypes) -> ReturnType)? As a type alias: typealias ClosureType = (ParameterTypes) -> ReturnType As a constant: let closureName: Clo

fuckingclosuresyntax.com

 

참고자료

https://docs.swift.org/swift-book/LanguageGuide/Closures.html#ID103