๋ณธ ๊ฒ์๋ฌผ์ ํด๋ก์ ์ ๊ธฐ๋ณธ ๋ถํฐ ์ฌํ๊น์ง ๋ชจ๋ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
swift ํจ์์ ๊ธฐ๋ณธ์ ๋ค๋ฃจ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ฑํ์ต๋๋ค.
Closure / ํด๋ก์
ํด๋ก์ ๋?
๋ณดํต์ ์ต๋ช ํจ์๋ฅผ ๋ปํ๋ค. ํ์ง๋ง named ํจ์๋ ํด๋ก์ ์ ์ํ๋ค๋ ์ฌ์ค !
ํด๋ก์ ๋ named Closure & unnamed Closure ๋๊ฐ์ง๋ฅผ ํฌํจํ๊ณ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ์ผ๋ฐ์ ์ธ ํจ์๋ named Closure์ด๋ค.
func NameClosure() {
print("I have a name")
}
์ต๋ช ํจ์๋ ์ ํํ๋ unnamed Closure์ด์ง๋ง, ๋ณดํต unnamed์ ์๋ตํ๊ณ ๊ทธ๋ฅ ํด๋ก์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฆ, ํด๋ก์ = ์ต๋ช ํจ์๋ผ๊ณ ํต์์ ์ผ๋ก ์๊ฐํ๋ฉด ๋ ๋ฏ ?
( ํด๋ก์ ๋ ์ต๋ช ํจ์์ด์ง๋ง, 1๊ธ ๊ฐ์ฒด ํจ์์ ํน์ฑ์ ๊ฐ์ง๋ค. )
์์ฝ
ํํ์
ํด๋ก์ ๋ ์ด๋ฆ์ด ์๋ ํจ์์ด๋ฏ๋ก ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
๋ณ์์ ๋ฐ๋ก ํจ์๋ฅผ ์์ฑํ๋ ํํ๊ฐ ์ผ๋ฐ์ ์ด๋ค.
var closure : (parameter) -> return_type = {(value : type) -> return_type in
//code
}
//ex
// "Hello World"๋ฅผ ์ถ๋ ฅํ๋ ์ต๋ช
ํจ์
var str_closure : () -> String = { () -> String in
return "Hello World"
}
var str_closure = {() -> String in
return "Hello World"
}
์๋ ์ฝ๋๋ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ ํจ์๋ฅผ named์ unnamed๋ก ์์ฑํ์๋ค.
unnamed๋ ์ต๋ช ํจ์์ด๋ฏ๋ก ์ด๋ฆ์์ด ๋ณ์์ ๋ฐ๋ก ํ ๋น ํ ์ ์๋ค.
named์ unnamed๋ฅผ ํธ์ถํ ๋ ์ฐจ์ด์ ์ unnamed๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ๋ง ๋ณด๋ธ๋ค.
func named(a: Int, b: Int) -> Int {
return a+b
}
var unnamed : (Int, Int) -> Int = {(a: Int, b: Int) -> Int in
return a+b
}
print(named(a: 10, b:100))
print(unnamed(10, 100)) // a:,b: ํ์์์!
๋ ํด๋ก์ ๋ ์์์ type์ ๋ช ์ํ๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ณ ์์ฑํ ์ ์๋ค.
์๋์ ๋ add ํด๋ก์ ๋ ๊ฐ์ ๋์์ ํ๋ค.
var add : (Int, Int) -> Int = {(a: Int, b: Int) -> Int in
return a+b
}
var add : (Int, Int) -> Int = {(a, b) -> Int in // a,b์ type์๋ต
return a+b
}
return type ์๋ต
ํด๋ก์ ๋ return ๊ฐ์ด ์์ผ๋ฉด return type์ ์๋ตํ๊ณ ์์ฑํ ์ ์๋ค.
var test = {() in print("Hello World")}
test() // "Hello World"
return ๊ฐ์ด ์์ด๋, ์ด๋ฏธ ๋ช ์ํด์ฃผ์๋ค๋ฉด ํด๋ก์ ์์๋ ์๋ต ๊ฐ๋ฅํ๋ค.
// ๋ณ์ ์์ฑ์ type์ ๋ชจ๋ ๋ช
์ํ์
var add : (Int, Int) -> Int = {(a, b) in
return a+b
}
์ฝ๋ฐฑ ํจ์
callback function์ผ๋ก ํด๋ก์ ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
โ callback function
-> ํจ์์ ์ ๋ฌ์ธ์๋ก ์ฐ๋ ๋ค๋ฅธ ํจ์
์ฝ๊ฒ ๋งํด ํ๋ผ๋ฏธํฐ์ ํจ์๋ฅผ ๋ฃ์ ์ ์๋๋ฐ ๊ทธ ํจ์๋ฅผ ์ฝ๋ฐฑํจ์๋ผ๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด, ๋ํ๊ธฐ๋ฅผ ํ๋ add ํด๋ก์ ์ ๋นผ๊ธฐ๋ฅผ ํ๋ substract ํด๋ก์ ๊ฐ ์๋ค๊ณ ํ์.
cluc๋ ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ๋ฐ์ ๋ํ๊ธฐ ๋๋ ๋นผ๊ธฐ๋ฅผ ๊ณ์ฐํ๊ณ ์ ํ๋ค.
์๋ ์ฝ๋ method : (Int, Int) -> Int ์ ๊ฐ์ด ์ฝ๋ฐฑํจ์๋ฅผ ๋ฐ๋๋กํ๊ณ , ํ๋ผ๋ฏธํฐ๋ก ํด๋ก์ ๋ฅผ ๋ฃ์ ์ ์๋ค.
var add : (Int, Int) -> Int = {(a: Int, b: Int) in
return a+b
}
var substract : (Int, Int) -> Int = {(a: Int, b: Int) in
return a-b
}
func cluc(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a,b)
}
print(cluc(a: 10, b: 1, method: add)) // 11
print(cluc(a: 10, b: 1, method: substract)) // 9
๋๋ ํ๋ผ๋ฏธํฐ์ ์ด๋ฏธ ์ ์ธ๋์ด์๋ ํด๋ก์ ๋ณ์๋ฅผ ๋ฃ์ง ์๊ณ , ๋ฐ๋ก ํด๋ก์ ๋ฅผ ๋ง๋ค์ด ๋ฃ์ ์๋ ์๋ค.
print(cluc(a: 10, b: 2, method: {(a: Int, b: Int) -> Int in
return a/b
}))
ํด๋ก์ ์ฌํ
Trailling Closure / ํํ ํด๋ก์
ํด๋ก์ ๊ฐ ์ฝ๋ฐฑํจ์๋ก ์ฌ์ฉ๋ ๋ ํ๋ผ๋ฏธํฐ์ ๋ฃ์ง ์๊ณ ๋ค์ ์์ฑํ ์ ์๋ค.
๊ธฐ์กด์ ์ฝ๋ฐฑํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์๋ค.
cluc(a: 10, b: 2, method: {(a: Int, b: Int) -> Int in
return a/b
})
ํํ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ฉด, method๋ผ๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์๋ตํ๊ณ ๋ค์ ์์ฑํ๋ค.
cluc(a: 10, b: 2){(a: Int, b: Int) -> Int in
return a/b
}
๋ง์ฝ ํ๋ผ๋ฏธํฐ๊ฐ ํด๋ก์ ๋ฐ์ ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
func sample (method : () -> Void ){
method()
}
sample(){() in print("Hello World")}
func sample(method: () -> Void ){
method()
}
sample{
print("Hello World")
}
Shorthand Argument Names / ์ถ์ฝ ์ธ์ ์ด๋ฆ
์ถ์ฝ ์ธ์ ์ด๋ฆ.. ์ด๋ฆ๋ถํฐ ๋ณต์กํ๋ค.
์ผ๋จ, ์ด๋ฆ์ ์ถ์ฝํ๋ค๋ ๋ป์ผ๋ก ํด์ํ๋ฉด ๋๋ค. ์ด๋ฆ์ ์ถ์ฝํ๋ค๋?
์์์๋ a+b๋ฅผ ํ๋ ํด๋ก์ ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์๋ค.
var add : (Int, Int) -> Int = {(a: Int, b: Int) in
return a+b
}
์ถ์ฝ ์ธ์๋ a, b ๋์ $0๋ถํฐ ์ค๋ฆ์ฐจ์์ผ๋ก ๊ฐ์ ๋งค๊ธด๋ค.
์ฆ, a == $0 , b == $1 ...
๐ ์ถ์ฝ์ธ์์ด๋ฆ์ ์ฌ์ฉํ ๋๋ ๋งค๊ฐ๋ณ์์ด๋ฆ๊ณผ in ์ ์๋ตํ๋ค.
๋ณ์ add์ ์ ์ฅํ ํด๋ก์ ๋ฅผ ์ถ์ฝ์ธ์์ด๋ฆ์ ์ฌ์ฉํด์ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
var add : (Int, Int) -> Int = {
return $0 + $1
}
print(add(1,2)) // 3
๋ง์ฝ, ์ ์ฝ๋์ฒ๋ผ ํด๋ก์ ์ return๋ฌธ ์ธ์ ์์ฑํ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ์๋ return ํค์๋๋ ์๋ต ๊ฐ๋ฅํ๋ค !
var add : (Int, Int) -> Int = {
$0+$1
}
print(add(1,2)) // 3
์์์ ์์ฑํ๋ ์ฝ๋๋ฅผ ํด๋ก์ ์ฌํ๋ฅผ ํตํด ์ถ์ฝํ๋ฉด โ๏ธ
var add : (Int, Int) -> Int = {(a: Int, b: Int) in
return a+b
}
var substract : (Int, Int) -> Int = {(a: Int, b: Int) in
return a-b
}
func cluc(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a,b)
}
print(cluc(a: 10, b: 1, method: add)) // 11
print(cluc(a: 10, b: 1, method: substract)) // 9
// ํํํด๋ก์ + ์ถ์ฝ์ธ์์ด๋ฆ
func cluc(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
return method(a,b)
}
print(cluc(a: 10, b: 1){ $0 + $1 }) // 11
print(cluc(a: 10, b: 1){ $0 - $1 }) // 9
ํด๋ก์ .. ์ ๊ธฐํ๋ฉด์๋ ์ด๋ ต๋ค ๐คฆโ๏ธ
'๐ Programming > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] class ์์(Inheritance) (0) | 2022.02.03 |
---|---|
[Swift] property(ํ๋กํผํฐ) (0) | 2022.01.24 |
[Swift] ์ด๊ฑฐํ(Enumerations) (0) | 2022.01.20 |
[Swift] ์ ์ด๋ฌธ (์กฐ๊ฑด๋ฌธ / ๋ฐ๋ณต๋ฌธ) (0) | 2022.01.18 |
[Swift] function / ํจ์ (0) | 2022.01.15 |