- μ½λμμ μ¬μ©νκ±°λ μ λ¬ν μ μλ λ 립μ μΈ κΈ°λ₯μ κ°μ§ λΈλ
- ν¨μλ ν΄λ‘μ μ μΌμ’
μ μ(Global) ν¨μμ μ€μ²©(Nested) ν¨μλ μ¬μ€ ν΄λ‘μ μ νΉμν μμ ν΄λΉ.
ν΄λ‘μ λ λ€μ 3κ°μ§ μ€ ν κ°μ§ μ νμ κ°μ§
- Global functions: μ΄λ¦μ κ°μ§λ©°, μ΄λ€ κ°λ μΊ‘μ³νμ§ μλ ν΄λ‘μ
- Nested functions: μ΄λ¦μ κ°μ§λ©°, κ°μΈκ³ μλ ν¨μμ κ°μ μΊ‘μ³νλ ν΄λ‘μ
- Closure: μ£Όλ³ λ¬Έλ§₯(Context)μ κ°μ μΊ‘μ³ν μ μμΌλ©°, κ°λ¨ν λ¬Έλ²μΌλ‘ μ°μ¬μ§ μ΄λ¦ μλ ν΄λ‘μ
μΈλΆν¨μ
print(1)
max(1, 2)
func globalFunction() { } //μΈλΆ, λ°κΉ₯μμ μ°μ΄λ κ².
μ€μ²©ν¨μ
func outsideFunction() -> () -> () { //ν¨μλ₯Ό 리ν΄νμ
μΌλ‘ λ€λ£Έ.
var x = 0
func nestedFunction() { //μ€μ²©ν¨μ: λ°κΉ₯μμ varμ μΈ (κΈλ‘λ²νμ
), λ΄λΆμμ μ΄μ©
x += 1 // κ·Έ μμ μ ν¨μκ° κ°μ§μ§ μμ κ°μ μ¬μ©
print(x)
}
return nestedFunction
}
let nestedFunction = outsideFunction()
nestedFunction()
nestedFunction()
nestedFunction()
κΈ°λ³Έν
Closure Expression Syntax
{ (νλΌλ―Έν°) -> 리ν΄νμ
in
μ€νꡬ문
}
func aFunction() { //viod νμ
print("This is a function.")
}
aFunction()
aFunction()
({
print("This is a closure.")
})()
// ν΄λ‘μ λ₯Ό λ³μμ λ΄μ μ΄λ¦ λΆμ¬ κ°λ₯
let closure = { //voidνμ
print("This is a closure.")
}
closure()
closure()
// ν¨μλ λ³μλ‘ μ μ₯ κ°λ₯
var function/* : () -> () */= aFunction //viodνμ
function()
// κ°μ νμ
μΌ κ²½μ° ν¨μλ ν΄λ‘μ κ΄κ³μμ΄ μΉν κ°λ₯
function = closure
function()
type(of: function)
type(of: closure)
// νλΌλ―Έν° + λ°ν νμ
μ κ°μ§ ν¨μ
func funcWithParamAndReturnType(_ param: String) -> String {
return param + "!"
}
print(funcWithParamAndReturnType("function"))
//μ€νΈλ§μ λ°ννλ ν¨μ, return λ΄κ°μνλ νλΌλ―Έν° μ λ¬.
// νλΌλ―Έν° + λ°ν νμ
μ κ°μ§ ν΄λ‘μ
// Type Annotation
let closureWithParamAndReturnType1: (String) -> String = { param in
return param + "!"
}
print(closureWithParamAndReturnType1("closure"))
// Argument Labelμ μλ΅. ν¨μμ Argument Labelμ (_)λ‘ μλ΅ν κ²κ³Ό λμΌ
// νλΌλ―Έν° + λ°ν νμ
μ κ°μ§ ν΄λ‘μ // νμ
μ λ΄λΆμ μΈ μλ μμ.
let closureWithParamAndReturnType2 = { (param: String) -> String in
return param + "!"
}
print(closureWithParamAndReturnType2("closure"))
// νλΌλ―Έν° + λ°ν νμ
μ κ°μ§ ν΄λ‘μ
// Type Inference //리ν΄κ³Ό μκ΄νΈλ₯Ό μλ΅ν μλ μμ.
let closureWithParamAndReturnType3 = { param in
param + "!"
}
print(closureWithParamAndReturnType3("closure"))
- λ¬Έμμ΄μ μ λ ₯λ°μΌλ©΄ κ·Έ λ¬Έμμ΄μ κ°μλ₯Ό λ°ννλ ν΄λ‘μ Έ ꡬν
- μ«μ νλλ₯Ό μ λ ₯λ°μ λ€ 1μ λν κ°μ λ°ννλ ν΄λ‘μ Έ ꡬν
// 1λ² λ¬Έμ μ. "Swift" -> 5
let comString = { (origin: String) -> Int in
return origin.count
}
print(comString("swift"))
//1λ²μ 3λ² μ μ©νλ €λ©΄ νμ
λͺ
μν΄μ€μΌν¨.
let counting: (String) -> Int = { param in
param.count
}
counting("swift")
// 2λ² λ¬Έμ μ. 5 -> 6
let comInt = {(master: Int) -> Int in
return master + 1
}
print(comInt(5))
//
let byInt = { origin in
origin + 1
}
print(byInt(4))
/// λ¬Έμμ΄μ μ
λ ₯λ°μΌλ©΄ κ·Έ λ¬Έμμ΄μ κ°μλ₯Ό λ°ννλ ν΄λ‘μ Έ ꡬν
// 1λ¨κ³ - ν¨μλ‘ μκ°
func stringCount(str: String) -> Int {
return str.count
}
print(stringCount(str: "Swift"))
// 2λ¨κ³ - ν΄λ‘μ λ‘ λ³ν
let stringCount = { (str: String) -> Int in
return str.count
}
stringCount("Swift")
// 3λ¨κ³ - λ¬Έλ² μ΅μ ν
let stringCount2: (String) -> Int = { $0.count }
/// μ«μ νλλ₯Ό μ
λ ₯λ°μ λ€ 1μ λν κ°μ λ°ννλ ν΄λ‘μ Έ ꡬν
//func addOne = (num: Int) -> Int
//return num + 1
let addOne = { (num: Int) -> Int in
return num + 1
}
addOne(5)
let addTwo: (Int) -> Int = { $0 + (5) }
addTwo(5)
- λ¬Έλ² κ°μν /κ°λ μ±
- μ§μ°μμ± / μ€μ λ‘ μ½λλ₯Ό μ¬μ©ν μκΈ°κ° μμλ, λ©λͺ¨λ¦¬μ μ¬λΌκ°λκ².
- μ£Όλ³ μ»¨ν μ€νΈμ κ°μ μΊ‘μ³νμ¬ μμ μνκ°λ₯
###Swift ν΄λ‘μ λ¬Έλ² μ΅μ ν
- λ¬Έλ§₯μ ν΅ν΄ 맀κ°λ³μ λ° λ°ν κ°μ λν νμ μΆλ‘
- λ¨μΌ ννμ ν΄λ‘μ μμμ λ°ν ν€μλ μλ΅ /(returnμλ΅)
- μΆμ½ μΈμλͺ //($0)
- νν ν΄λ‘μ λ¬Έλ²
// μ
λ ₯λ λ¬Έμμ΄μ κ°μλ₯Ό λ°ννλ ν΄λ‘μ λ₯Ό ν¨μμ νλΌλ―Έν°λ‘ μ λ¬νλ μ
func performClosure(param: (String) -> Int) { //param: ν¨μλ₯Ό 맀κ°λ³μλ‘ λ°λ ν¨μ. paramμ inputμ stringμΌλ‘ λ°κ³ , λ°νμ intλ‘ νλ€λ λ».
param("Swift")
}
performClosure(param: { (str: String) -> Int in //λͺ¨λ λ΄μ©μ λ€ μ μ κ².
return str.count
})
performClosure(param: { (str: String) in //.countκ° Intμ΄κΈ° λλ¬Έμ μλ΅κ°λ₯.
return str.count
})
performClosure(param: { str in //νμ
μ μ΄λ―Έ Stringμ λ°κ³ μλ€λ κ±Έ μμ μμ΄μ Stingλ μλ΅κ°λ₯.
return str.count
})
performClosure(param: { //맀κ°λ³μλͺ
λ μλ΅κ°λ₯. $0,$1,$2 λ±μΌλ‘ ννκ°λ₯.
return $0.count
})
performClosure(param: { //return μλ΅κ°λ₯.
$0.count
})
performClosure(param: ) { //paramκ° νκ°μΌ κ²½μ°. κ΄νΈ λ«μΌλ©΄, paramμ λ§μ§λ§ νλΌλ―Έν° κ°μΌλ‘ λ°μλ€μ.
$0.count
}
performClosure() { //λ§μ§λ§ νλΌλ―Έν°λΌλ©΄, (param: )μ μλ΅ν΄λ λ¨.
$0.count
}
performClosure { $0.count } //μκ΄νΈλ μλ΅κ°λ₯.
//νμ
μΆλ‘ μ λͺ»νλ κ²½μ°μλ νμ
μ λͺ¨λ μ μ΄μ€μΌνμ§λ§, μΆλ‘ μ΄ κ°λ₯νλ€λ©΄ μ€μ¬λκ° μ μμ.
//νλΌλ―Έν°κ° 1κ°μΈκ²½μ° μ΅μ’
κΉμ§ κ°λ₯νμ§λ§, νλΌλ―Έν°κ° λ€μμΌ κ²½μ°, μ΅μ’
κΉμ§λ λΆκ°.($0,$1λ±μΌλ‘ νμ©νκ±°λ return μλ΅..)
//νμ
λ€μμ, ν΄λ‘μ μ°μ΄λ κ²½μ°, ν¨μκ° λ€μ΄κ°λ건μ§, ν΄λ‘μ κ° λ€μ΄κ°λ κ±΄μ§ κ΅¬λΆν΄μΌν¨.
- ν¨μμ μΈμ(Argument)λ‘ λ€μ΄κ°λ ν΄λ‘μ
ν¨μμ΄μ© λ²μ
func closureParamFunction(closure: () -> Void) {
closure()
}
func printFunction() {
print("Swift Function!")
}
let printClosure = {
print("Swift Closure!")
}
closureParamFunction(closure: printFunction)
closureParamFunction(closure: printClosure)
μΈλΌμΈ ν΄λ‘μ λ²μ
// μΈλΌμΈ ν΄λ‘μ - λ³μλ ν¨μμ²λΌ μ€κ° 맀κ°μ²΄ μμ΄ μ¬μ©λλ ν΄λ‘μ
closureParamFunction(closure: {
print("Inline closure - Explicit closure parameter name")
})
- ν¨μμ κ΄νΈκ° λ«ν νμλ μΈμλ‘ μ·¨κΈλλ ν΄λ‘μ
- ν¨μμ λ§μ§λ§ μΈμ(Argument)μλ§ μ¬μ© κ°λ₯νκ³ ν΄λΉ μΈμλͺ μ μλ΅
- νλμ λΌμΈμ λ€ νννμ§ λͺ»ν κΈ΄ ν΄λ‘μ Έμ μ μ©
κΈ°λ³Έν
//λ§μ§λ§ μΈμλ₯Ό μλ΅ν μ μλκ² - νΈλ μ΄λ ν΄λ‘μ
// νμ λλ νν ν΄λ‘μ
// closureParamFunction { <#code#> }
closureParamFunction(closure: {
print("Inline closure - Explicit closure parameter name")
})
closureParamFunction() {
print("Trailing closure - Implicit closure parameter name")
}
closureParamFunction {
print("Trailing closure - Implicit closure parameter name")
}
func multiClosureParams(closure1: () -> Void, closure2: () -> Void) {
closure1()
closure2()
}
//μΈλΌμΈ νμ
multiClosureParams(closure1: {
print("inline")
}, closure2: {
print("inline")
})
//νΈλ μ΄λ νμ
//λ§μ§λ§ μΈμκ° μμνκΈ° μ§μ μ λ«μλ²λ¦Ό.
multiClosureParams(closure1: {
print("inline")
}) {
print("trailing")
}
- μ μλ₯Ό νλ μ λ ₯λ°μ 2μ λ°°μ μ¬λΆλ₯Ό λ°ννλ ν΄λ‘μ Έ
- μ μλ₯Ό λ κ° μ λ ₯ λ°μ κ³±ν κ²°κ³Όλ₯Ό λ°ννλ ν΄λ‘μ Έ
//μ μλ₯Ό νλ μ
λ ₯λ°μ 2μ λ°°μ μ¬λΆλ₯Ό λ°ννλ ν΄λ‘μ Έ
let Question = { (origin: Int) -> Bool in
return origin % 2 == 0
}
//
let Question1 = {$0 % 2 == 0}
Question1(5)
Question1(6)
/// μ μλ₯Ό λ κ° μ
λ ₯λ°μ κ³±ν κ²°κ³Όλ₯Ό λ°ννλ ν΄λ‘μ Έ
let multiplyTwoNumbers = { (op1: Int, op2: Int) -> Int in
return op1 * op2
}
// Optimization
let multiplyTwoNumbers2: (Int, Int) -> Int = { $0 * $1 }
multiplyTwoNumbers(20, 5)
multiplyTwoNumbers(5, 10)
multiplyTwoNumbers2(5, 10)