
func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>, ...) -> <반환 결과 타입> { // 함수 코드 }
- func : 이것이 함수라고 컴파일러에게 알려주는 키워드
- <함수명> : 함수에 할당되는 이름
- <매개변수 이름> : 함수 코드 내에서 참조할 매개변수의 이름
- <매개변수 타입> : 해당 매개변수의 타입
- <반환 결과 타입> : 함수가 반환하는 결과의 데이터 타입, 만약 함수과 결과를 반환하지 않는다면 반환 결과 타입을 지정하지 않음.
- <함수 코드> : 작업을 수행하는 함수의 코드
<함수명> (<인자 1>, <인자 2>,...)
사람의 이름을 입력으로 받아 그 사람의 인사말을 반환하는 greet(person:) 함수
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
greet 함수 호출
print(greet(person: "Anna"))
// Prints "Hello, Anna!"
print(greet(person: "Brian"))
// Prints "Hello, Brian!"
함수 정의는 어떠한 파라미터가 없더라도 함수의 이름 뒤에 소괄호가 필요하다.
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
// Prints "hello, world"
함수는 함수의 소괄호 내에 콤마로 구분하여 여러개의 입력 파라미터를 가질 수 있다
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!"
person 이라는 라벨을 가진 String 인수값과 alreadyGreeted 이라는 라벨을 가진 Bool 인수값을 소괄호 안에 콤마로 구분하여 greet(person:alreadyGreeted:) 함수로 전달하여 호출한다.
함수는 반환 타입 정의를 요구하지 않는다.
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave")
// Prints "Hello, Dave!"
위 코드는 String 값을 출력하는 greet(person:) 함수이다.
여러개의 값을 반환하기 위해 함수의 반환 타입으로 튜플 타입을 사용할 수 있다.
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)
}
minMax(array:) 함수는 2개의 Int 값을 포함한 튜플을 반환한다.
이 값들은 함수의 반환 값을 조회할 때 이름으로 접근할 수 있도록 min 과 max 로 라벨되어 있다.
함수는 배열의 나머지 값들을 반복하고 각 값이 currentMin 과 currentMax 의 값보다 더 작거나 더 큰지 확인합니다.
가장 작고 가장 큰 값은 2개의 Int 값인 튜플로 반환된다.
함수에서 반환되는 튜플 타입이 전체 튜플에 대해 "값이 없을" 가능성이 있는 경우 옵셔널 튜플 반환 타입을 사용하여 전체 튜플이 nil 일 수 있다는 사실을 반영할 수 있다.
(Int, Int)? 또는 (String, Int, Bool)? 와 같이 튜플 타입의 닫는 소괄호 다음에 물음표를 붙여 옵셔널 튜플 반환 타입을 작성한다.
예를 들어서, 위의 코드에서 array 인수가 빈 배열을 포함한다면 array[0] 을 접근할 때 런타임 에러가 발생한다.
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)
}
하지만 이와 같이 옵셔널 튜플 반환 타입을 가지면 배열이 비어있을 때 nil 을 반환하여 안전하게 처리할 수 있다.
지역 매개변수명 : 함수 코드 내에서 참조할 수 있는 이름
외부 매개변수명 : 함수 외부에서 참조할 수 있는 이름
let message = buildMessageFor(name: "John", count: 100)
이 함수의 선언부에는 'name'과 'count'를 지역 매개변수명이자 외부 매개변수명으로 사용한다고 선언한 것을 볼 수 있다.
func buildMessageFor(_ name: String, _ count: Int) -> String {
return ("\(name), you are customer number \(count)")
}
매개변수에 할당된 디폴트 외부 매개변수명은 다음과 같이 지역 매개변수명 앞에 밑줄 문자(_)를 써서 없앨 수 있다.
위와 같이 구현했다면 다음과 같이 함수를 호출해야 한다.
let message = buildMessageFor("John", 100)
지역 매개변수명 앞에 외부 매개 변수명을 선언하면 외부 매개변수명이 추가된다.
func buildMessageFor(userName name: String, userCount count: Int) -> String {
return ("\(name), you are customer number \(count)")
}
이렇게 외부 매개 변수명을 추가했다면 함수를 호출할 때 반드시 외부 매개변수명을 참조해야 한다.
let message = buildMessageFor(username: "John", usercount: 100)
외부 매개변수명이 추가되어도 함수 내에서 매개변수를 참조할 때에는 지역 매개변수명을 사용해야 한다.
함수가 호출될 때 함수가 받게 될 매개변수가 몇 개인지 알 수 없는 경우에 가변 매개변수를 사용하여 처리할 수 있다.
지정된 데이터 타입의 매개변수 0개 또는 그 이상을 받는다는 것을 의미하는 점 세개(...)를 이용하여 가변 매개변수를 선언한다.
func displayStrings(_ strings: String...)
{
for string in strings {
print(string)
}
}
displayStrings("one","two","three","four")
기본적으로 함수가 받는 매개변수는 상수로 취급된다. 만약 함수 내에서 값을 변경하고 싶다면, 매개변수의 Shadow copy를 생성해야 한다.
func calcuateArea(length: Float, width: Float) -> Float {
var length = length
var width = width
//shadow copy 생성
length = length * 2.54
width = width * 2.54
return length * width
}
print(calcuateArea(length: 10, width: 20))
변수에 함수 타입 할당
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
var mathFunction: (Int, Int) -> Int = addTwoInts
'2개의 Int 값과 Int 를 반환하는 함수' 의 타입을 가지는 mathFunction 이라는 변수를 정의한다. addTwoInts 라는 함수를 참조하기 위해 새로운 변수에 설정한다.
addTwoInts(_:_:) 함수는 mathFunction 변수와 같은 타입을 가지므로 Swift의 타입 검사기는 할당을 허락한다.
즉, mathFunction 이라는 이름으로 할당된 함수를 호출할 수 있다.
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"
스위프트에서는 함수가 데이터 타입처럼 취급 될 수 있다.
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// Prints "Result: 8"
3개의 파라미터를 가지는 printMathResult(_:_:_:) 함수
mathFunction 이라 불리는 (Int, Int) -> Int 타입printMathResult(_:_:_:) 호출할 때 addTwoInts(::) 함수와 정수 3 과 5 가 전달
함수의 반환 타입으로 함수 타입을 사용할 수 있다.
반환하는 함수의 반환 화살표 (->) 바로 뒤에 완전한 함수 타입을 작성하면 된다.
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
stepForward(_:) 와 stepBackward(_:) 라 불리는 간단한 2개의 함수를 정의
stepForward(_:) 함수 : 입력값에 1을 더해 반환
stepBackward(_:) 함수 : 입력값에 1을 빼고 반환
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
반환 타입이 (Int) -> Int(함수) 인 chooseStepFunction(backward:) 함수
backward 부울 파라미터를 토대로 stepForward(:) 함수 또는 stepBackward(:) 함수를 반환