함수가 받는 모든 매개변수는 상수 let가 기본값임
함수 선언할 때, 매개변수를 변수 var로 바꿔줄 수 있음 -> shadow copy 라고 함
func getName(name: String, age: Int) -> String {
var name = "KK" // 변수로 변경해주지 않으면 아래 코드에서 에러 발생
name = "KeeN"
return "\(name) is \(age) years old"
}
func getNameAndAge(name: String, age: Int) -> String {
return "\(name) is \(age) years old"
}
위에서 함수를 선언할 때 name, age 파라미터를 지역 매개변수라고 하고,
기본적으로 함수 매개변수에는 동일한 지역 매개변수명과 외부 매개변수명이 할당됨
getNameAndAge(name: "KeeN", age: 25)
함수를 호출할 때 쓰이는 외부 매개변수명이 자동으로 할당되지만 아래와 같이 함수를 선언하면 생략 가능함
func getNameAndAge(_ name: String, age: Int) -> String {
return "\(name) is \(age) years old"
}
_ name 으로 선언하면 외부 매개변수명을 생략하여 사용할 수 있음
getNameAndAge("KeeN", age: 25)
외부 매개변수명을 함수 선언부에서 선언도 가능함
func getNameAndAge(userName name: String, userAge age: Int) -> String {
return "\(name) is \(age) years old"
}
이렇게 선언했다면 아래와 같이 호출해야함
getNameAndAge(userName: "KeeN", userAge: 25)
func getNameAndAge(_ name: String = "KeeN", age: Int) -> String {
return "\(name) is \(age) years old"
}
디폴트 매개변수 값을 지정해주면 아래와 같이 name을 생략하여 호출할 수 있음
getNameAndAge(age: 25)
getNameAndAge("KeeNNN", age: 30) // 다른 이름으로 변경도 가능
func displayNumbers(_ strings: String...) {
for string in strings {
print(string)
}
}
displayNumbers("one", "two", "three", "four")
함수가 몇개의 매개변수를 받을지 모르는 경우 ...을 사용하여 선언할 수 있음
func plusOne(_ number: Int) -> Int {
var number = number // shadow copy
number += 1
return number
}
var myNumber: Int = 10
let result: Int = plusOne(myNumber)
print(myNumber) // 10 출력
print(result) // 11 출력
print(myNumber) // 그대로 10 출력
원본 변수의 값을 변경하기 위해서는 함수를 선언할 때 입출력 매개변수로 선언해줘야 함
func plusOne(_ number: inout Int) -> Int { // inout -> 입출력 매개변수
// var number = number -> shadow copy는 필요 없음
number += 1
return number
}
var myNumber: Int = 10
print(myNumber) // 10 출력
print(plusOne(&myNumber) // 11 출력, & 붙여줘야 원본 값 변경 가능
print(myNumber) // 변경된 값 11 출력
함수가 데이터 타입처럼 취급될 수 있음
함수를 상수나 변수에 할당하는 것도 가능함
func plusOne(_ number: Int) -> Int {
return number + 1
}
let plus1 = plusOne // 함수를 상수에 할당
let result = plus1(10) // 상수 이름을 이용하여 함수 호출 가능
print(result) // 11 출력
함수를 매개변수로 받는 또 다른 함수 선언 예시
func getName(_ name: String) -> String {
return name
}
let name = getName
func outputPrint(_ exampleFunction: (Float) -> Float, value: Float) {
let result = exampleFunction(value)
print(result)
}
outputPrint(name, value: 10)