func greet(person: String) -> String {
return "Hello, " + person + "!"
}
print(greet(person: "Harry"))
// Hello, Harry!
let greetBrian: String = greet(person: "Brian")
// greetBrian : Hello, Brian!
-> **
을 붙여주지 않으면 반환값이 없는 함수가 되는데,-> Void
형식. (Void = ()
)func minMax(array: [Int]) -> (min: Int, max: Int)? {
guard !array.isEmpty else { return nil }
let min = array.min()!
let max = array.max()!
return (min, max)
}
let minMax1 = minMax(array: [1, 2, 3])
print(minMax1)
// Optional((min: 1, max: 3))
let minMax2 = minMax(array: [])
print(minMax2)
// nil
_
키워드로 인자값 생략 가능func greet(_ person: String, from hometown: String = "Busan") -> String {
return person + " is from " + hometown + "."
}
print(greet("Kim", from: "Seoul"))
// Kim is from Seoul.
print(greet("Lee"))
// Lee is from Busan.
func sum(_ numbers: Int...) -> Int {
var sum = 0
for number in numbers { sum += number }
return sum
}
print(sum(1, 2, 3, 4, 5))
// 15
inout
키워드swap(&a, &b)
의 역할과 비슷하다.func swap(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
var int1 = 10
var int2 = 20
swap(&int1, &int2)
// int1 : 20, int2 : 10
함수의 인자 값과 반환 값, 변수의 타입이 같으면 변수에 함수를 할당할 수 있다.
func addTwoInts(_ a: Int, _ b: Int) -> Int { return a + b }
// addTwoInts: (Int, Int) -> Int
var addFunction: (Int, Int) -> Int = addTwoInts
// or
// var addFunction = addTwoInts (타입 추론)
print(addFunction(2, 3))
// 5
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print(mathFunction(a, b))
}
printMathResult(addTwoInts, 3, 5)
// 8
func add(_ a: Int, _ b: Int) -> Int { return a + b }
func sub(_ a: Int, _ b: Int) -> Int { return a - b }
func chooseMathFunction(isAdd: Bool) -> (Int, Int) -> Int {
return isAdd ? add : sub
}
let mathFunction = chooseMathFunction(isAdd: true)
print(mathFunction(2, 3))
함수 내부에 또 다른 함수를 선언하고, 사용할 수 있다.
중첩 함수는 함수 밖에서는 감춰줘 있고, 함수 내부에서는 접근 가능
중첩 함수는 함수 안에 있는 변수 / 상수들을 사용 가능
func chooseMathFunction(isAdd: Bool) -> (Int, Int) -> Int {
func add(_ a: Int, _ b: Int) -> Int { return a + b }
func sub(_ a: Int, _ b: Int) -> Int { return a - b }
return isAdd ? add : sub
}
let mathFunction = chooseMathFunction(isAdd: true)
print(mathFunction(2, 3))
// 5