- 기본값을 갖는 매개변수는 매개변수 목록 중에 뒤쪽에 위치하는 것이 좋다.
func 함수명 (매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 = 매개변수 기본값 ... ) -> 반환타입 {
함수 구현부
return 반환값
}
func greeting(friend: String, me: String = "hyun") {
print("Hello \(friend)! I'm \(me)")
}
- 매개변수 기본값을 가지는 매개변수는 생략 가능
greeting(friend: "haha")
greeting(friend: "soso", me: "vela")
- 전달인자 레이블
- 함수를 호출할 때 매개변수의 역할을 좀 더 명확하게 하거나, 함수 사용자의 입장에서 표현하고자 할 때 사용한다.
- 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용한다
func 함수명 (전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ... ) -> 반환타입 {
함수 구현부
return
}
func greeting(to friend: String, from me: String) {
print("Hello \(friend)! I'm \(me)")
}
함수의 중복정의도 가능하다! to~ from 전달인자 레이블을 사용해
이전에 썼던 greeting이라는 함수명과 같은 이름을 갖고 있지만,
다른 이름을 가진 효과를 낼 수 있다. greetin to~ from까지 이름이 됨
- 함수를 호출할 때에는 전달인자 레이블을 사용해야한다.
greeting(to: "hyun", from "jina")
- 내부에서는 매개변수를, 외부에서 호출할 때는 전달인자 레이블을!
- 가변 매개변수 (...)
- 전달 받을 값의 개수를 알기 어려울 때 사용.
- 가변 매개변수는 함수당 하나만 가질 수 있다.
- 맨 뒤에 위치하는게 좋다.
매개변수2타입 뒤의 마침표 세 개가 가변 매개변수 역할이다.
func 함수명 (매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입...) -> 반환타입 {
함수 구현부
return
}
func sayHelloToFriends(me: String, friends: String...) -> Striing {
return "Hello \(friends)! I'm \(me)!"
}
print(SayHelloToFriends(me: "hyun", friends: "jiwoo", "jiwon", "jina"))
print(sayHelloToFriends(me: "hyun"))
이렇게 비워두거나 nil을 넣어 두면 오류가 생긴다. 넘기고 싶지 않다면 위와 같이 생략을 해두자.
- 데이터 타입으로서의 함수
- 스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어
- 스위프트 함수는 일급객체이므로 변수, 상수 등에 저장이 가능하고, 매개변수를 통해 전달할 수도 있다!
- 함수의 타입 표현
- 반환 타입을 생략할 수 없다.
- 타입이 다른 함수는 할당할 수 없다.
func greeting(to friend: String, from me: String) {
print("Hello \(friend)! I'm \(me)")
}
func sayHelloToFriends(me: String, friends: String...) -> Striing {
return "Hello \(friends)! I'm \(me)!"
}
(매개변수1타입, 매개변수2타입...) -> 반환타입
var someFunction: (String, Strinig) -> Void = greeting(to:from:)
someFunction("jiwoo", "hyun")
someFunction = greeting(friend:me:)
someFunction("jiwoo", "hyun")
friends가 String타입이긴 하지만, 가변매개변수이기 때문에 다른 타입으로 취급.
func runAnother(function: (String, String) -> Void {
function("jenny", "mike")
}
runAnother(function: greeting(friend:me:))
runAnother(function: someFunction)
)