💡 함수, 가변 매개변수, 전달인자 레이블, 데이터 타입으로서의 함수
import Foundation
func 함수명(매개변수명: 매개변수타입, 매개변수명, 매개변수타입) -> 반환타입 {
//코드 구현부
return 반환값
}
func sum(a: Int, b: Int) -> Int {
return a + b
}
sum(a: 12, b: 6)
func printName(name: String) -> Void {
print(name)
}
//반환 타입을 생략할 수 있다.
func printName(name: String) {
print(name)
}
printName(name: "sujilee")
func maximumIntegerValue() -> Int {
return Int.max
}
maximumIntegerValue()
func sayHello() {
print("hello")
}
sayHello()
튜플 사용 예시
func getCadetInfo() -> (intraID: String, coalitions: String) {
(intraID: "sujilee", coalitions: "Gam")
}
let cadet = getCadetInfo()
//함수의 반환값에의 접근
print(cadet.intraID, cadet.coalitions)
//OUTPUT : sujilee Gam
import Foundation
//기본값을 갖는 매개변ㄴ수는 매개변수 목록 중 뒤쪽에 위치하는 것이 좋다.
func 함수명(매개변수이름: 매개변수타입, 매개변수이름: 매개변수타입 = 매개변수기본값) -> 반환타입 {
//함수 구현부
return 반환값
}
func versus(challenger: String, champion: String = "sujilee") {
print("\(champion) vs \(challenger)")
}
//기본값을 가지는 매개변수는 함수 호출 시 생략할 수 있다.
versus(challenger: "jji")
//OUTPUT : sujilee vs jji
//기본값을 가지는 매개변수의 값을 원하는 값으로 갱신하는 것도 가능
versus(challenger: "leelea", champion: "sujilee")
//OUTPUT : sujilee vs leelea
함수 외부에서. 즉 함수 호출 시 함수의 매개변수의 역할을 더 명확히 표현하고자 할 때 사용한다.
import Foundation
func 함수명(전달인자레이블 매개변수명: 매개변수타입) -> 반환타입 {
//코드 구현부
return 반환값
}
//함수 내부에선는 전달인자레이블을 사용할 수 없다.
func inviteFriend(to friend: String, from host: String) {
print("\(host) invites \(friend)")
}
//함수 호출 시에는 매개변수명을 사용할 수 없다.
//오로지 전달인자레이블만 사용해야 함.
inviteFriend(to: "jji", from: "sujilee")
//OUTPUT : sujilee invites jji
func sendLetter(from writter: String, to reciever: String) -> String {
return "\(writter)는 마음을 담아 \(reciever)에게 편지를 보낸다."
}
print(sendLetter(from: "sujilee", to: "jji"))
//OUTPUT : sujilee는 마음을 담아 jji에게 편지를 보낸다.
//와일드카드 식별자 사용
func sendLetter(_ writter: String, _ reciever: String) -> String {
return "\(writter)는 마음을 담아 \(reciever)에게 편지를 보낸다."
}
print(sendLetter("sujilee", "jji"))
//OUTPUT : sujilee는 마음을 담아 jji에게 편지를 보낸다.
함수의 전달 인자 레이블이 서로 다르다? 다른 함수이다. 이는 전달인자 레이블만 바꿔 함수를 오버로딩하는 것을 가능하게 한다.
전달받을 인자의 개수를 알기 어려울 때 사용하며, 함수당 하나의 가변 매개변수만 사용할 수 있다.
import Foundation
func 함수명(매개변수명: 매개변수타입, 전달인자레이블 매개변수명: 매개변수타입...) -> 반환타입 {
//코드 구현부
return 반환값
}
func inviteFriends(host: String, friends: String...) -> String {
return "sujilee invites \(friends)"
}
print(inviteFriends(host: "sujilee", friends: "jji", "hyobagi", "jyp", "jinbe"))
//OUTPUT : sujilee invites ["jji", "hyobagi", "jyp", "jinbe"]
//가변 매개변수는 생략 가능하다.
print(inviteFriends(host: "sujilee"))
//OUTPUT : sujilee invites []
스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이므로, 스위프트의 함수는 일급 객체이다. 따라서 함수를 변수, 상수 등에 할당할 수 있으며 매개변수를 통해 전달할 수도 있다.
import Foundation
func printField(cadet: String, field: String) -> Void {
print("\(cadet)'s field is \(field)")
}
//함수의 타입 표현. 반환타입의 생략은 불가능하다.
//var 변수명: (매개변수타입, 매개변수타입) -> 반환타입 = 함수명)매개변수
var someFunction: (String, String) -> Void = printField(cadet:field:)
someFunction("sujilee", "iOS")
//OUTPUT : sujilee's field is iOS
//변수, 상수의 타입을 생략해도 할당하는 함수를 통해 타입을 추론할 수 있다.
//반환타입도 생략할 수 있으나 권장되는 않는지 아래처럼 fix 해준다.
var someFunctionWithoutType: Void = printField(cadet: "sujilee", field: "iOS")
//OUTPUT : sujilee's field is iOS
func printMacbook(owner: String, someMac: String) -> String {
return "\(owner)'s Macbook is \(someMac)"
}
var someFunction: (String, String) -> Void
//ERROR : 컴파일 오류 발생
// Cannot assign value of type 'String' to type '(String, String) -> Void'
someFunction = printMacbook(owner: "sujilee", someMac: "intel Macbook pro 16")
func smallerFunction(size: String) -> Void {
print("this function prints \(size) function")
}
//biggerFunction은 매개변수의 타입이 String이고 반환타입이 Void인 어떤 함수를 인자로 받을 것이다.
//인자로 받은 함수의 매개변수에 값을 할당한다.
func biggerFunction(function: (String) -> Void) {
function("small")
}
//biggerFunction의 인자로 smallerFunction을 넘긴다.
//smallerFunction의 인자값은 이미 biggerFunction의 코드 구현부에서 할당해줬음
biggerFunction(function: smallerFunction(size:))
//OUTPUT : this function prints small function
func printUniversity(name: String, university: String) -> Void {
print("\(name) is student of \(university)")
}
var someFunction: (String, String) -> Void
someFunction = printUniversity(name:university:)
//함수 printUniversity에 인자로 넘어온 값이 없으니, printUniversity 변수 someFunction에는 아무 값도 없는 상태이다.
func runAnotherFunction(function: (String, String) -> Void) {
function("sujilee", "KU")
}
//runAnotehrFunction 내부에서 값 "sujilee"와 "KU"를 printUniversity
//따라서 변수 someFunction는 "sujilee"와 "KU"를 인자값으로 갖고 있는 printUniversity를 값으로 갖고 있다.
//함수를 매개변수로 하는 runAnotherFunction에 someFuntion을 인자로 넘긴다.
//someFunction의 타입은 함수이고, "sujilee"와 "KU"를 가지고 있는 함수 printUniversity를 값으로 가지고 있기 때문에 가능하다.
runAnotherFunction(function: someFunction)
//OUTPUT : sujilee is student of KU
참고 :