매개 변수에 기본으로 전달될 값들을 미리 지정해줄 수 있다.
func greeting(friend: String, me: String = "CHOI") {
print("Hello \(friend)! I'm \(me)")
}
greeting(friend: "KIM")
//>> Hello KIM! I'm CHOI
그리고 이렇게 기본값을 가지는 매개 변수들은 가장 뒤쪽에 적어주는것이 좋다.
func greeting(friend: String, me: String = "CHOI") {
print("Hello \(friend)! I'm \(me)")
}
greeting(friend: "KIM", me: "HA")
//>> Hello KIM! I'm HA
만약 기본값 외에 따라 값을 넣어주고 싶으면 me
라는 매개변수를 명시한다음에 값을 지정해주면 된다.
func greeting(friend: String, me: String = "CHOI") {
print("Hello \(friend)! I'm \(me)")
}
greeting(friend: "KIM", me: "HA")
func greeting(to friend: String, from me: String = "CHOI") {
print("Hello \(friend)! I'm \(me)")
}
greeting(friend: "KIM", me: "HA")
//>> Hello KIM! I'm HA
//>> Hello KIM! I'm HA
함수 외부에서는 꼭 전달인자 레이블을 사용해야하고 함수 내부에는 꼭 매개변수 이름을 사용해야한다.
func sayHelloToFriends (me: String, friends: String...) -> String {
return "Hi \(friends), I'm \(me)"
}
print(sayHelloToFriends(me: "CHOI", friends: "KIM","LEE"))
//>> Hi ["KIM", "LEE"], I'm CHOI
print(sayHelloToFriends(me: "CHOI"))
//>> Hi [], I'm CHOI
만약 가변인자에 아무값도 넘기고 싶지 않으면 그냥 지우면 된다.
만약 (friends: )
이나 (friends: nil)
를 하면 오류가 발생한다.
Swift에서 함수는 일급객체로 변수나 상수에 저장이 가능하다.
그리고 또한 매개변수를 통해 전달 될 수 있다.
func greeting(to friend: String, from me: String = "CHOI") {
print("Hello \(friend)! I'm \(me)")
}
var somefunction: (String, String) -> Void = greeting(to:from:)
somefunction("there", "KIM")
//>> Hello there! I'm KIM
somefunction
라는 변수에 (String, String) -> Void
즉, 문자열 두개를 매개변수를 가지고 반환값이 없는 함수가 들어온다 라고 명시 해주는 것이다. 그리고 그 함수가 greeting(to:from:)
라고 명시 해준 것이다.
func sayHelloToFriends(me: String, friends: String...) -> String {
return "Hello \(friends)! I'm \(me)!"
}
var somefunction: (String, String) -> Void = sayHelloToFriends(me:friends:)
somefunction("there", "KIM")
//>> 오류 발생
여기선 friends
가 String 타입이기는 하나 가변 매개변수 이기 때문에 오류가 발생한다.
이처럼 타입이 다른 함수는 할당할 수 없다.
또한 비슷하게 함수 타입을 매개변수로 지정할 수 있다.
func func1(var1: (String, String) -> Void){
var1("str1", "str2")
var1("str3", "str4")
}
func1(var1: greeting(friend:me:))
//>>Hello str1! I'm str2
//>>Hello str3! I'm str4
func1
의 매개변수 var1
은 String 2개를 매개변수로 가지고 반환값이 없는 함수의 타입을 가진다는 의미이다.
var fun_var: (String, String) -> Void = greeting(friend:me:)
func1(var1: fun_var)
//>>Hello str1! I'm str2
//>>Hello str3! I'm str4
그리고 또한 이렇게 변수에 담겨있는 함수를 넘겨줄 수 있다.
전체적으로 다시한번 살펴보면 아래와 같다.
func 함수이름_A(A매개변수: (문자열, 문자열) -> 반환값없음){
함수이름_A("매개변수_1", "매개변수_2")
}
함수이름_A(A매개변수: 함수이름_b)
복잡하니까 한줄씩 다시 살펴보면
func 함수이름_A(A매개변수: (문자열, 문자열) -> 반환값없음)
문자열 2개를 가지고 반환값이 없는 함수를 매개변수로 지정한다. 즉 매개변수는 함수이다.
함수이름_A("매개변수_1", "매개변수_2")
그리고 A매개변수
로 받는 함수에 들어갈 매개변수는 "매개변수_1", "매개변수_2" 이다.
즉 예를 들어서 함수이름_A
의 매개변수가 다른 함수 함수이름_b
를 받을 때 함수이름_b
에 들어갈 매개변수가 "매개변수_1", "매개변수_2" 라는 의미이다.
함수이름_A(A매개변수: 함수이름_b)
함수이름_A를 실행하라 이때 매개변수로 들어가는 함수는 함수이름_b의 타입을 가진다.