์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ค๋์ ์ค์ํํธ ๊ณต์๋ฌธ์ chapter 6 ํจ์ ๋ถ๋ถ์ ๋ํด์ ์ ๋ฆฌํ ๊ฒ์ ์ ๋ก๋ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
Swift Documetns chapter.06 Functions
Functions (ํจ์)
ํจ์๋ ํน์ ์๋ฌด๋ฅผ ์ํํ๋ ๋ ๋ฆฝ๋ ์ฝ๋ ์กฐ๊ฐ์ด๋ค. ํจ์์๋ ๋ญ ํ๋์ง ์๋ณํ ์ด๋ฆ์ ๋ถ์ฌํ๋ฉฐ, ํ์ํ ๋ ์ด ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์๋ฌด๋ฅผ ์ํํ ํจ์๋ฅผ ‘ํธ์ถ'ํ์ฌ ์ฌ์ฉํ๋ค.
Defining and Calling Func (ํจ์ ์ ์ ๋ฐ ํธ์ถ)
ํจ์๋ฅผ ์ ์ํ ๋, func๋ผ๋ ํค์๋๋ก ์ ์ํ๋ค. ๋งค๊ฐ๋ณ์(parameters)์ ๋ฐํํ์ (return type)์ด๋ผ๊ณ ํ๋ ์ถ๋ ฅ์ผ๋ก ๋๋๋ ค์ค ๊ฐ ํ์ ์ ์ต์ ์ผ๋ก ์ ์ํ ์ ์๋ค.
func greet(person: String) -> String {
let greeting = "hello, " + persong
return greeting
}
ํจ์๋ฅผ ํธ์ถํ์ฌ ์๋์ ๊ฐ์ด ์ถ๋ ฅํ ์ ์๋ค.
print(greet(person: "potato"))
Function Parameters and Return Values
์ค์ํํธ๋ ํจ์ ๋งค๊ฐ ๋ณ์์ ๋ฐํ๊ฐ์ ๊ทน๋๋ก ์ ์ฐํ๋ค. “์ด๋ฆ์๋ ๋จ์ผ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ๋จ์ํ ๋ณด์กฐ์ฉ ํจ์" ๋ถํฐ “์๋ก๋ค๋ฅธ ๋งค๊ฐ๋ณ์ ์ต์ ์ ๊ฐ์ง ๋ณต์กํ ํจ์"๊น์ง ์ด๋ค ๊ฒ์ด๋ ์ ์ ๊ฐ๋ฅํ๋ค.
Functions without Parameters (๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์)
ํจ์์์ ์ ๋ ฅ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ ฅํ๋ ๊ฒ์ ํ์๊ฐ ์๋๋ค. ํธ์ถํ ๋๋ง๋ค ํญ์ ๋๊ฐ์ String๋ฉ์์ง๋ฅผ ๋ฐํํ๋ ์ ๋ ฅ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์๋ฅผ ์๋์ ์ ์ํ๋ค.
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
Functions with Multiple Parameters (๋งค๊ฐ๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ํจ์)
ํจ์๋ ๊ดํธ ์์ ์ผํ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ๋ฌ๊ฐ์ ์ ๋ ฅ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person:person)
}
}
print(greet(person:"Tim", alreadyGreeted: true))
// "Hello again, Tim!" ์ ์ธ์ํ๊ฒ ๋จ
Functions Without Return Values (๋ฐํ ๊ฐ์ด ์๋ ํจ์)
ํจ์์์ ๋ฐํํ์ ์ ์ ์ํ๋ ๊ฒ์ ํ์๊ฐ ์๋๋ค. ๊ฐ์ ๋ฐํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐํ ํ์ดํ (->) ๋ ๋ฐํํ์ ์ ์์ฑํ์ง ์๊ณ ๋ฐ๋ก { ๋ฅผ ์์ฑํ๋ค.
func greet(person: String) {
print("hello, \\(person)!")
}
greet(person: "jisoo")
ํจ์๋ฅผ ํธ์ถ ํ ๋, ๋ฐํ๊ฐ์ ๋ฌด์ํ ์๋ ์๋ค.
func printAndCount(string: String) -> Int {
print(string)
return string.count
}
func printWithoutCounting(string: String) {
let _ = printAndCount(string: string)
}
printAndCount(string: "hello, world")
// "hello, world" ๋ฅผ ์ธ์ํ๊ณ 12 ๋ผ๋ ๊ฐ์ ๋ฐํํจ
printWithoutCounting(string: "hello, world")
// "hello, world" ๋ฅผ ์ธ์ํ์ง๋ง ๊ฐ์ ๋ฐํํ์ง ์์
Functions with Multiple Return Values (๋ฐํ๊ฐ์ด ์ฌ๋ฌ ๊ฐ์ธ ํจ์)
ํํ ํ์ ์ ํจ์์ ๋ฐํ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ํ๋์ ๋ณตํฉ ๋ฐํ ๊ฐ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ฐํํ ์ ์๋ค.
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
ํํ์ ๊ฐ์ ํใ ์ ๋ฐํ ํ์ ์์ ์ด๋ฆ์ ๋ถ์๊ธฐ ๋๋ฌธ์, dot syntax๋ก ์ ๊ทผํด์ ์ต์ ๋ฐ ์ต๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \\(bounds.min) and max is \\(bounds.max)")
// "min is -6 and max is 109" ๋ฅผ ์ธ์ํจ
Optional Tuple Return Types (์ต์ ๋ ํํ ๋ฐํ ํ์ )
ํจ์๊ฐ ๋ฐํํ๋ ํํ ํ์ ์์ ์ ์ฒด ํํ์ ‘๊ฐ์ด ์์'์ ์๋ ๊ฒฝ์ฐ, ์ต์ ๋ ํํ ๋ฐํ ํ์ ์ ์ฌ์ฉํ๋ฉด ํํ์ด nil์ผ ์ ์๋ค๋ ์ฌ์ค์ ๋ฐ์ํ ์ ์๋ค.
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
Functions With an Implicit Return (์์์ ์ผ๋ก ๋ฐํํ๋ ํจ์)
์ ์ฒด ํจ์ ๋ณธ๋ฌธ์ด ๋จ์ผ ํํ์์ธ ๊ฒฝ์ฐ, ํจ์๊ฐ ํด๋น ํํ์์ ์์์ ์ผ๋ก ๋ฐํํ๋ค.
func greeting(for person: String) -> String {
"Hello, " + person + "!"
}
print(greeting(for: "Dave"))
// "Hello, Dave!" ๋ฅผ ์ธ์ํจ
func anotherGreeting(for person: String) -> String {
return "Hello, " + person + "!"
}
print(anotherGreeting(for: "Dave"))
// "Hello, Dave!" ๋ฅผ ์ธ์ํจ
Function Argument Labels and Parameter Names
ํจ์ ๋งค๊ฐ๋ณ์์๋ ๊ฐ๊ฐ์ ์ธ์ ์ด๋ฆํ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ด ์๋ค. ์ธ์์ด๋ฆํ๋ ํจ์๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํ๋๋ฐ, ๊ฐ๊ฐ์ ์ธ์ ์์ ์์ ์ ์ธ์ ์ด๋ฆํ๋ฅผ ๊ฐ์ง๊ณ ํจ์ ํธ์ถ์ ์์ฑํ๋ค. ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ํจ์ ๊ตฌํ์์ ์ฌ์ฉํ๋ค. ๋งค๊ฐ๋ณ์๊ฐ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์์ ์ ์ธ์ ์ด๋ฆํ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ค์ํ์ ์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ ๋ฐ๋์ ์ ์ผํ ์ด๋ฆ์ ๊ฐ์ ธ์ผํ๋ค.
func someFunction (firstParameterName: Int, secondParameterName: Int) {
// ํจ์ ๋ณธ๋ฌธ์์, firstParameterName ๊ณผ secondParameterName ์
// ์ฒซ ๋ฒ์งธ ๋ฐ ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์์ ์ธ์ ๊ฐ์ ์ฐธ์กฐํฉ๋๋ค.
}
someFunction(firstParameterName: 1, secondParameterName: 2)
Specifying Argument Labels (์ธ์ ์ด๋ฆํ ์ง์ ํ๊ธฐ)
์ธ์์ด๋ฆํ๋ ๋งค๊ฐ๋ณ์ ์ด๋ฆ ์์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์์ฑํ๋ค. ์ธ์์ด๋ฆํ๋ฅผ ์ฌ์ฉํ๋ฉด ์ดํด๊ฐ ์ฝ๊ณ ์๋๊ฐ ๋ช ํํ ํจ์ ๋ณธ๋ฌธ์ ์ ๊ณตํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ๋ฌธ์ฅ๊ฐ์ ๊ด๋ก์ ๋ฐ๋ผ ํจ์๋ฅผ ํธ์ถฃ ํ ์์๋ค.
func someFunction(argumentLabel parameterName: Int) {
// ํจ์ ๋ณธ๋ฌธ์์ parameterName์ ํด๋น ๋งค๊ฐ๋ณ์์ ์ธ์ ๊ฐ์ ์ฐธ์กฐํ๋ค.
}
์์๋ฅผ ์ดํด๋ณด์.
func greet(person: String, from hometown: String) -> String {
return "Hello \\(person)! Glad you could visit from \\(hometown)."
}
print (greet(person: "Bill", from: "Cupertino"))
// "Hello Bill! Glad you could visit from Cupertino." ๋ฅผ ์ธ์ํจ
Omitting Argument Labels (์ธ์ ์ด๋ฆํ ์๋ตํ๊ธฐ)
๋งค๊ฐ๋ณ์์ ์ธ์ ์ด๋ฆํ๋ฅผ ์ํ์ง ์๋๋ค๋ฉด ํด๋น ๋งค๊ฐ๋ณ์์ ๋ํ ๋ช ์์ ์ธ ์ธ์ ์ด๋ฆํ ๋์ ๋ฐ์ค(_)์ ์์ฑํ๋ค.
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// ํจ์ ๋ณธ๋ฌธ์์, firstParameterName ๊ณผ secondParameterName ์
// ์ฒซ ๋ฒ์งธ ๋ฐ ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์์ ์ธ์ ๊ฐ์ ์ฐธ์กฐํฉ๋๋ค.
}
someFunction (1, secondParameterName: 2)
Default Parameter Values (๊ธฐ๋ณธ ๋งค๊ฐ๋ณ์ ๊ฐ)
ํด๋น ๋งค๊ฐ๋ณ์ ํ์ ๋ค์ ๊ฐ์ ํ ๋นํจ์ผ๋ก์จ ์ด๋ค ํจ์ ๋งค๊ฐ๋ณ์์๋ ๊ธฐ๋ณธ๊ฐ์ ์ ์ํ ์ ์๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ์ํ๋ฉด, ํจ์๋ฅผ ํธ์ถํ ๋ ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์๋ตํ ์ ์๋ค.
func someFunction (parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
// ์ด ํจ์๋ฅผ ํธ์ถํ ๋ ๋ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ๋ฉด,
// parameterWithDefault ๊ฐ์ด ํจ์ ๋ณธ๋ฌธ ์์์ 12 ๊ฐ ๋ฉ๋๋ค.
}
someFunction (parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault ๋ 6 ์
someFunction (parameterWithoutDefault: 4) // parameterWithDefault ๋ 12 ์
Variadic Parameters (๊ฐ๋ณ ๋งค๊ฐ๋ณ์)
๊ฐ๋ณ๋งค๊ฐ๋ณ์๋ ํน์ ํ์ ์ ๊ฐ์ 0๊ฐ ์ด์ ๋ฐ์๋ค์ธ๋ค. ๊ฐ๋ณ๋งค๊ฐ๋ณ์๋ ํจ์ ํธ์ถํ ๋ ๋งค๊ฐ๋ณ์์๋ค๊ฐ ๋ค์ํ ๊ฐ์์ ์ ๋ ฅ๊ฐ์ ์ ๋ฌํ ์ ์์์ ์ง์ ํ๊ณ ์ ์ฌ์ฉํ๋ค. ๋งค๊ฐ๋ณ์ ํ์ ์ด๋ฆ ๋ค์ ๋ง์นจํ ๋ฌธ์ ์ธ๊ฐ (...) ๋ฅผ ์ง์ด๋ฃ์ด์ ๋งค๊ฐ๋ณ์๋ฅผ ์์ฑํ๋ค.
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// ์ด ๋ค์ฏ ์๋ค์ ์ฐ์ ํ๊ท ์ธ, 3.0 ์ ๋ฐํํจ
arithmeticMean(3, 8.25, 18.75)
// ์ด ์ธ ์๋ค์ ์ฐ์ ํ๊ท ์ธ, 10.0 ์ ๋ฐํํจ
In-Out Parameters (์ -์ถ๋ ฅ ๋งค๊ฐ๋ณ์)
๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ๋งค๊ฐ๋ณ์๋ ์์์ด๋ค. ํด๋น ํจ์ ๋ณธ๋ฌธ์์์ ํจ์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ฐ๊พธ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ค์๋ก ๋ฐ๊ฟ ์ ์๋ค๋ ๋ป์ ์๋ฏธํ๋ค. ํจ์์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์์ ํ๊ณ ์ถ๊ณ , ํจ์ ํธ์ถ์ด ๋๋ ํ์๋ ์ด๋ ๊ฒ ๋ฐ๊พผ๊ฒ์ ์ง์ํ๊ณ ์ถ๋ค๋ฉด, ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ถ๋ ฅ๋งค๊ฐ๋ณ์๋ก ๋์ ์ ์ํ ์์๋ค.
๋งค๊ฐ ๋ณ์ ํ์ ๋ฐ๋ก ์์ inout ํค์๋๋ฅผ ๋ฌ์ ์ -์ถ๋ ฅ ๋งค๊ฐ ๋ณ์๋ฅผ ์์ฑํ๋ค. ์ -์ถ๋ ฅ ๋งค๊ฐ ๋ณ์๋ ์๋ณธ ๊ฐ์ ๋์ฒดํ๋ ค๊ณ , ํจ์ ์์ผ๋ก *์ ๋ ฅ (in)*ํ์ฌ, ํจ์๊ฐ ์์ ํ ๋ค์, ํจ์ ๋ฐ์ผ๋ก ์ถ๋ ฅ (out) ๋๋ ๊ฐ์ ๊ฐ์ง๋ค.
๋ณ์๋ง ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์ ์ธ์๋ก ์ ๋ฌํ ์ ์๋ค. ์์๋ ๊ธ์๊ฐ(literal)์ ์ธ์๋ก ์ ๋ฌํ ์ ์๋๋ฐ, ์์์ ๊ธ์๊ฐ์ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์์ ์ธ์๋ก ์ ๋ฌํ ๋๋, ํจ์๊ฐ ์์ ํ ์ ์์์ ์ง์ํ๊ธฐ ์ํด ๋ณ์ ์ด๋ฆ ๋ฐ๋ก ์์ & ๋ฅผ ๋ถ์ธ๋ค.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \\(someInt), and anotherInt is now \\(anotherInt)")
// "someInt is now 107, and anotherInt is now 3" ๋ฅผ ์ธ์ํจ
Function Types
๋ชจ๋ ํจ์๋ ํจ์์ ๋งค๊ฐ๋ณ์ ํ์ ๊ณผ ๋ฐํํ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ํน์ ํ ํจ์ํ์ ์ ๊ฐ์ง๋ค. ์์๋ฅผ ๋ณด์. ์๋ ์์ ๋ ๋จ์ํ ์ํ ํจ์ ๋๊ฐ๋ฅผ ์ ์ํ๋ค. ์ด ํจ์๋ ๊ฐ๊ฐ ๋๊ฐ์ int๊ฐ์ ์ทจํ๋ฉฐ ์ฐ์ฐ๊ฒฐ๊ณผ๋ Int๊ฐ์ ๋ฐํํ๋ค.
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
}
๋ค์์ ๋งค๊ฐ๋ณ์๋ ๋ฐํ๊ฐ์ด ์๋ ํจ์๋ฅผ ์ํ ๋ ๋ค๋ฅธ ์์ ์ด๋ค. ์ด ํจ์๋ () -> Void๋๋ ๋งค๊ฐ๋ณ์๊ฐ ์๊ณ Void ๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
func printHelloWorld() {
print("hello, world")
}|
Using Function Types (ํจ์ ํ์ ์ฌ์ฉํ๊ธฐ)
ํจ์ ํ์ ์ ์ค์ํํธ์ ๋ค๋ฅธ ์ด๋ค ํ์ ์ธ ๊ฒ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ๋ค์ด ์์๋ ๋ณ์๋ฅผ ํจ์ ํ์ ์ผ๋ก ์ ์ํ๊ณ ํด๋น ๋ณ์์ ์ ์ ํ ํจ์๋ฅผ ํ ๋นํ ์ ์๋ค. ์๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ดํดํ ์ ์๋ค.
“๋ Int๊ฐ์ ์ทจํ๊ณ , Int๊ฐ์ ๋ฐํํ๋ ํจ์ ํ์ ์ธ, mathFunction ์ด๋ผ๋ ๋ณ์๋ฅผ ์ ์ํ๋ค. ์ด ์ธ๋ณ์๊ฐ addTwoInts๋ผ๋ ํจ์๋ฅผ ์ฐธ์กฐํ๋๋ก ์ค์ ํ๋ค.”
var mathFunction: (Int, Int) -> Int = addTwoInts
addTwoInts(_:_:) ํจ์๋ mathFunction ๋ณ์์ ๋๊ฐ์ ํ์ ์ด๋ฏ๋ก, ์ค์ํํธ ํ์ -๊ฒ์ฌ๊ธฐ๊ฐ ์ด ํ ๋น์ ํ์ฉํ๋ค.
์ด์ ํ ๋นํ ํจ์๋ฅผ mathFunction ์ด๋ ์ด๋ฆ์ผ๋ก ํธ์ถํ ์ ์๋ค :
print("Result: \\(mathFunction(2, 3))")
// "Result: 5" ๋ฅผ ์ธ์ํจ
ํ์ ์ด ๋์ผํ๊ฒ ์ผ์นํ๋ ์๋ก ๋ค๋ฅธ ํจ์๋, ํจ์ ์๋ ํ์ ๊ณผ ๋๊ฐ์ด, ๋์ผํ ๋ณ์์ ํ ๋นํ ์ ์๋ค.
mathFunction = multiplyTwoInts
print("Result: \\(mathFunction(2, 3))")
// "Result: 6" ์ ์ธ์ํจ
๋ค๋ฅธ ์ด๋ค ํ์ ์ฒ๋ผ, ์์๋ ๋ณ์์ ํจ์๋ฅผ ํ ๋นํ ๋ ์ค์ํํธ๊ฐ ํจ์ ํ์ ์ ์ถ๋ก ํ๊ฒ ๋ด๋ฒ๋ ค ๋ ์ ์๋ค.
let anotherMathFunction = addTwoInts
// anotherMathFunction ์ (Int, Int) -> Int ํ์
์ด๋ผ๊ณ ์ถ๋ก ํจ
Function Types as Parameter Types (๋งค๊ฐ๋ณ์ ํ์ ์ผ๋ก์จ์ ํจ์ ํ์ )
(Int, Int) -> Int ์ ๊ฐ์ ํจ์ ํ์ ์ ๋ ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ ๋ณ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ํจ์๋ฅผ ํธ์ถํ ๋ ํจ์ ๊ตฌํ ์ผ๋ถ๋ฅผ ํจ์ ํธ์ถํ ์ชฝ์ด ์ ๊ณตํ๊ฒ ๋ด๋ฒ๋ ค ๋๊ฒ ํ๋ค.
๋ค์ ์์ ๋ ์์ ์๋ ์ํ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ํ๋ค.
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \\(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// "Result: 8" ๋ฅผ ์ธ์ํจ
Function Types as Return Types (๋ฐํ ํ์ ์ผ๋ก์จ์ ํจ์ ํ์ )
ํจ์ํ์ ์ ๋ ๋ค๋ฅธ ํจ์์ ๋ฐํ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ฐํํ ํจ์์ ๋ฐํ ํ์ดํ (->) ๋ฐ๋ก ๋ค์ ์์ ํ ํจ์ ํ์ ์ ์์ฑํ๋ฉด ๋๋ค.
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
๋ค์์ ๋ฐํํ์ ์ด (Int) -> Int ์ธ ํจ์์ด๋ค. ์ด ํจ์๋ backward๋ผ๋ ๋ถ๋ฆฌ์ธ ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ์ด๋ก, stepForward() ํจ์๋ stepBackward() ํจ์๋ฅผ ๋ฐํํ๋ค.
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
์ด์ chooseStepFunction(backwardโกฬ ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ชฝ ๋๋ ์ ์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฑธ์์ ์ฎ๊ธฐ๋ ํจ์๋ฅผ ๊ตฌํ ์ ์๋ค.
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero ๋ ์ด์ stepBackward() ํจ์๋ฅผ ์ฐธ์กฐํจ
print("Counting to zero:")
// ์๊น์ง ์
:
while currentValue != 0 {
print("\\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// ์!
Nested Functions (์ค์ฒฉํจ์)
์ด ์ฅ์์ ์ง๊ธ๊น์ง ๋ง์ฃผ์น ๋ชจ๋ ํจ์๋ ์ ์ญ ๋ฒ์์์ ์ ์ํ ์ ์ญํจ์ ์์ ์๋ค. ๋ค๋ฅธ ํจ์ ๋ณธ๋ฌธ ์์์ ํจ์๋ฅผ ์ ์ํ ์๋ ์๋๋ฐ ์ด๋ฅผ ์ค์ฒฉํจ์๋ผ๊ณ ํ๋ค.
์ค์ฒฉํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ ์ธ๊ณ๋ก๋ถํฐ ์จ๊ฒจ์ ธ ์์ง๋ง, ์์ ์ ๋๋ฌ์ผ ํจ์์์ ์ฌ์ ํ ํธ์ถํ๊ณ ์ฌ์ฉํ ์ ์๋ค. ์ค์ฒฉํจ์๋ฅผ ๋๋ฌ์ผ ํจ์๋ ๋ ๋ค๋ฅธ ์์ญ์์ ์ฌ์ฉํ ์ ์๋๋ก ์์ ์ ์ค์ฒฉํจ์ ํ๋๋ฅผ ๋ฐํํ ์๋ ์๋ค.
์ค์ฒฉํจ์๋ฅผ ์ฌ์ฉํ๊ณ ๋ฐํํ๋๋ก ์์ chooseStepFunction(backward: )์์ ๋ฅผ ์ฌ์์ฑ ํด๋ณด์.
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero ๋ ์ด์ ์ค์ฒฉ ํจ์์ธ stepForward() ๋ฅผ ์ฐธ์กฐํจ
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// ์!