각 함수 파라미터는 인수 라벨 (argument label) 과 파라미터 이름 (parameter name) 을 가지고 있다. 인수 라벨은 함수가 호출될 때 사용되고 각 인수는 함수 호출 시 인수 라벨 다음에 작성한다. 파라미터 이름은 함수를 구현할 때 사용된다. 기본적으로 파라미터는 인수 라벨로 파라미터 이름을 사용한다.
func someFunction(firstParameterName: Int, secondParameterName: Int) {
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}
someFunction(firstParameterName: 1, secondParameterName: 2)
모든 파라미터는 유니크한 이름을 가져야 한다. 여러 파라미터에 동일한 인수 라벨을 가질 수 있지만 유니크한 인수 라벨은 코드를 더욱 읽기 편하게 해준다.
공백으로 구분하여 파라미터 이름 앞에 인수 라벨을 작성한다.
func someFunction(argumentLabel parameterName: Int) {
// In the function body, parameterName refers to the argument value
// for that parameter.
}
다음은 사람의 이름과 고향을 가져와 인사말을 반환하는 greet(person:) 함수의 변형이다.
func greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill! Glad you could visit from Cupertino."
인수 라벨을 사용하면 문장과 같은 표현방식으로 함수를 호출할 수 있는 동시에 읽기 쉽고 의도가 명확한 함수 본문을 제공할 수 있다.
파라미터에 인수 라벨을 원치 않으면 명시적인 인수 라벨 대신에 언더바 (_)를 작성한다.
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}
someFunction(1, secondParameterName: 2)
파라미터가 인수 라벨을 가지고 있다면 함수를 호출할 때 인수는 반드시 라벨을 지정해야 한다.
파라미터의 타입 뒤에 파라미터 값을 할당하여 함수의 파라미터에 기본값 (default value) 을 정의할 수 있다. 기본값이 정의되어 있다면 함수를 호출할 때 파라미터를 생략할 수 있다.
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
// If you omit the second argument when calling this function, then
// the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12
가변 파라미터 (variadic parameter) 는 0개 이상의 특정 타입의 값을 허용한다. 함수가 호출될 때 여러개의 입력값이 전달될 수 있는 특정 파라미터는 가변 파라미터를 사용한다. 가변 파라미터는 파라미터의 타입 이름 뒤에 세개의 간격 문자 (...)를 추가하여 작성한다.
가변 파라미터에 전달된 값은 함수 본문 내에서 적절한 타입의 배열로 사용할 수 있다. 예를 들어 numbers 라는 이름과 Double... 타입을 가진 가변 파라미터는 함수 본문 내에서 [Double] 타입의 numbers 라 불리는 상수 배열로 사용할 수 있다.
아래 예제는 길이에 관계없이 숫자 리스트에 대한 산술 평균 을 계산한다.
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)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8.25, 18.75)
// returns 10.0, which is the arithmetic mean of these three numbers
함수는 여러개의 가변 파라미터를 가질 수 있다. 가변 파라미터 뒤에 오는 첫번째 파라미터는 인수 라벨을 가지고 있어야 한다. 인수 라벨은 가변 파라미터에 전달되는 인수와 가변 파라미터 뒤에 오는 파라미터에 전달되는 인수를 명확하게 한다.
함수 파라미터는 기본적으로 상수이다. 해당 함수의 본문 내에서 함수 파라미터 값을 변경하려고 하면 컴파일 타입 에러가 발생한다. 이것은 실수로 파라미터의 값을 변경할 수 없다는 것을 의미한다. 함수의 파라미터 값을 변경하고 함수 호출이 종료된 후에도 이러한 변경된 값을 유지하고 싶다면 in-out 파라미터 (in-out parameter) 로 대신 정의해야 한다.
in-out 파라미터는 파라미터의 타입 바로 전에 inout 키워드를 작성한다. in-out 파라미터는 함수로 전달하는 값을 가지고 있고 함수로 부터 이 값을 수정하고 원래 값을 대체하기위해 함수 밖으로 다시 되돌려 준다.
in-out 파라미터의 인수로 변수만 전달할 수 있다. 상수와 반복은 수정할 수 없기 때문에 인수로 상수 또는 반복 값은 전달할 수 없다. 함수에 수정가능함을 알리기 위해 in-out 파라미터에 인수로 전달할 때 변수의 이름 앞에 앰퍼샌드 (&)를 붙여 준다.
Note:
in-out 파라미터는 기본값을 가질 수 없고 가변 파라미터는 inout 으로 표기할 수 없다.
다음 예제의 함수는 a 와 b 라 하는 2개의 in-out 정수 파라미터를 가지는 swapTwoInts(::)이다.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
swapTwoInts(::) 함수는 간단하게 b 의 값을 a 로 a 의 값을 b 로 바꾼다. 이 함수는 a 의 값을 temporaryA 라 하는 임시 상수에 저장하고 b 의 값을 a 에 할당하고 temporaryA 의 값을 b 에 할당한다.
Int 타입의 바꿀 2개의 변수를 이용하여 swapTwoInts(::) 함수를 호출할 수 있다. swapTwoInts(::) 함수에 전달할 때 someInt 와 anotherInt 의 이름 앞에 앰퍼샌드를 붙여야 한다.
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
위의 예제는 someInt 와 anotherInt 의 기본값이 함수의 바깥에서 정의되었지만 swapTwoInts(::) 함수로 인해 원래값이 수정되는 것을 보여 준다.
Note:
in-out 파라미터는 함수에서 값을 반환하는 것과 다르다. 위의 swapTwoInts 예제는 반환 타입을 정의하거나 값을 반환하지 않지만 someInt 와 anotherInt 의 값은 여전히 수정한다. In-out 파라미터는 함수가 함수 본문의 범위를 벗어나 영향을 미치는 다른 방법이다.