func 키워드뒤에
함수 이름 : exampleFunction
파라미터와 타입 : (exampleInt: Int)
반환형 : -> Int
으로 함수를 정의합니다.
func exampleFunction(exampleInt: Int) -> Int {
return exampleInt
}
exampleFunction(exampleInt: 1)
func exampleFunction() -> Int {
var exmapleNumber = 1
return exampleNumber
}
func exampleFunction(int1: Int, int2: Int) -> result {
var result = int1 + int2
return result
}
리턴 자료형을 Void로 선언하거나 아예 안써도 된다.
또한 return뒤에 아무런 값을 쓰지 않는다면 return을 써도 에러가 없다.
func exampleFunction(int1: Int, int2: Int) -> Void {
var result = int1 + int2
print(result)
}
func secondExampleFunction(int1: Int, int2: Int) {
var result = int1 + int2
print(result)
}
func thirdExampleFunction(int1: Int, int2: Int) {
var result = int1 + int2
print(result)
return
}
값을 반환할 때 튜플을 이용하여 한번에 여러 값을 반환할 수 있다.
이또한 튜플로 반환하기 때문에 바인딩이 가능하고 값들의 타입에 구애받지 않을 수 있다.
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)
}
아래는 값을 튜플로 받아 min max를 이용해 값에 접근했다.
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
함수 선언시 파라미터명 앞에
함수 사용시에 쓸 임의의 이름을 입력하면
함수 호출시 앞서 입력한 그 임의의 이름으로 사용할 수 있다.
이것을 전달인자 레이블이라 한다.
func exampleFunction(name value1: String, from country: String) {
//함수 내부 생략
}
exampleFunction(name: "Ju Yeon Lee", from: "Korea")
스위프트는 함수 사용시에 파라미터명을 생략할 수 없지만 위의 방법을 응용하여 언더바(_)를 입력하여 파라미터명을 생략할 수 있다.
func exampleFunction(_ value1: String, _ country: String) {
//함수 내부 생략
}
exampleFunction("Ju Yeon Lee", "Korea")
함수 선언시 (파라미터명: 자료형 = 기본값) 형태로 기본값을 선언할 수 있다.
func example(parameter: Int = 7) {
var result = parameter + 3
print(result)
}
example()
//10 출력됨
인자의 자료형뒤에 공백없이 바로 "..."을 입력하면 가변적으로 입력 받을 수 있다.
전달받을 매개변수의 개수를 알기 어려울때 사용할 수 있다.
func addAllNumbers (_ numbers: Int...) -> Int {
var temp = 0
for a in numbers {
temp += a
}
return temp
}
print(addAllNumbers(1,2,3,4,5))//15
여태까지는 함수를 값에 의한 호출(call by value)방식으로 썼다면 인아웃 파라미터는 참조에 의한 호출(call by reference)방식으로 씁니다.
때문에 함수의 호출 시 파라미터의 인자를 &를 넣어주어 값의 주소를 보내야 합니다.
또한 참조에 의한 호출로 인해 함수 외부에서 쓰며 함수의 호출시에 사용한 값이 실제로 영향을 받게됩니다.
인아웃 파라미터는 기본값을 가질 수 없고, 가변 파라미터는 인아웃 파라미터로 선언할 수 없습니다.
func swapvalue(_ a: inout Int, _ b: inout Int) {
var temp = a
a = b
b = temp
}
var value1 = 2
var value2 = 6
swapvalue(&value1, &value2)
print(value1, value2)
함수를 변수로 정의해서 사용할 수 있습니다.
func addTwoInts(_ a: Int, _ b: Int) -> {
return a + b
}
var numbersum: (Int, Int) -> Int = addTwoInts
print("Result : \(numbersum(2,4))")
함수형을 명시적으로 선언하지 않아도 Swift에서 자체적으로 타입을 추론해 자동으로 함수를 할당할 수도 있다.
var numberSumVer2 = addTwoInts
스위프트는 다른 언어와 달리 받은 값을 기본적으로 상수로 선언합니다. 따라서 값의 수정을 원할 경우 추가적인 작업을 해줘야 합니다.
func exampleFunction(exampleInt: Int) -> Int {
var exampleInt = exampleInt
return exampleInt
}