구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수를 메서드라 부릅니다.
즉, 호칭이 달라질 뿐, 메서드 역시 함수입니다.
함수에서는 소괄호 (())를 생략할 수 없습니다.
오버라이드와, 오버로드를 모두 지원합니다.
매개변수의 타입이 다르면 같은 이름의 함수를 여러 개 만들 수 있습니다.
매개변수의 개수가 달라도 같은 이름의 함수를 만들 수 있습니다.
func 함수이름(매개변수...) -> return Type {
실행 구문
return 반환 값
}
func helloWorld(name: String) -> String {
return "Hello\(name)!"
}
let helloLumi: String = helloWorld(name: "Lumi")
print(helloLumi)
func helloWorld() -> String {
return "Hello, world!"
}
print(helloWorld())
매개변수가 여러개인 함수를 정의할 때는, 쉼표(,)로 매개변수를 구분합니다.
func sayHello(myName: String, yourName: String) -> String {
return "Hello\(yourName)! , I'm \(myName)"
}
print(sayHello(myName: "Lumi", yourName: "Asher"))
func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> return Type {
실행구문
return 반환 값
}
앞서 코드에서 myName과 yourName이라는 매개변수 이름을 사용했습니다.
매개변수 이름과 더불어 전달인자 레이블을 지정해줄 수 있습니다.
전달인자 레이블을 별도로 지정하면 함수 외부에서 매개변수의 역할을 좀 더 명확히 할 수 있습니다.
func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> return Type {
실행구문
return 반환 값
}
C언어와 자바 같은 기존 언어처럼 전달인자 레이블을 사용하고 싶지 않다면 와일드카드 식별자를 이용하세요
func sayHello(_ name: String, _ times: Int) -> String {
var result = ""
for _ in 0..<times {
result += "Hello \(name)!" + " "
}
return result
}
print(sayHello("Lumi", 5))
스위프트의 함수에서는 매개변수만다 기본값을 지정할 수 있습니다.
즉, 매개변수가 전달되지 않으면 기본값을 사용합니다.
func sayHello(_ name: String, _ times: Int = 3) -> String {
var result = ""
for _ in 0..<times {
result += "Hello \(name)!" + " "
}
return result
}
print(sayHello("Lumi"))
매개변수로 몇개의 값이 들어올지 모를 때, 가변 매개변수를 사용할 수 있습니다.
가변 매개변수는 0개 이상의 값을 받아올 수 있으며, 0개도 포함합니다.
가변 매개변수로 들어온 인자 값은 배열처럼 사용할 수 있습니다.
함수 별로 가변 매개변수는 하나만 가질 수 있습니다.
func sayHelloToFriends(me: String, friends names: String...) -> String {
var result: String = ""
for friend in names {
result += "hello \(friend)!" + " "
}
result += "I'm " + me + "!"
return result
}
print(sayHelloToFriends(me: "Lumi", friends: "Asher", "Avery", "Charlie", "Kyu", "Youth"))
함수는 특정 연산을 실행한 후 결과를 반환합니다.
그러나 굳이 반환할 필요가 없는 경우가 있습니다.
만약, 반환 값이 없는 함수라면, 반환 타입을 '없음'을 의미하는 Void로 표기하거나
반환 타입 표현을 생략합니다. (보통 생략합니다.)
func printHello() {
print("hello world")
}
printHello()
함수는 일급 객체입니다.
따라서, 하나의 데이터타입으로 사용할 수 있습니다.
즉, 각 함수는 매개변수 타입과 반환 타입으로 구성된 하나의 타입으로 사용(정의)할 수 있습니다.
// (매개변수 타입의 나열) -> 반환타입
func hello(name:String) -> String {
return "hello \(name)!"
}
// hello 함수의 타입은 (String) -> String 입니다.
함수를 데이터 타입으로 사용할 수 있다는 것은,
함수를 전달인자로 받을 수도, 반환 값으로 돌려줄 수도 있다는 의미입니다.
typealias CaculateTwoInts = (Int, Int) -> Int
// 함수 데이터 타입을 지정해줍니다.
func addTwoInt(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInt(_ a: Int, _ b: Int) -> Int {
return a * b
}
var mathFunction: CaculateTwoInts = addTwoInt
print(mathFunction(2, 5))
mathFunction = multiplyTwoInt
print(mathFunction(2, 5))
typealias CaculateTwoInts = (Int, Int) -> Int
// 함수 데이터 타입을 지정해줍니다.
func addTwoInt(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInt(_ a: Int, _ b: Int) -> Int {
return a * b
}
func chooseMathFunction(_ toAdd: Bool) -> CaculateTwoInts {
return toAdd ? addTwoInt : multiplyTwoInt
}
print(chooseMathFunction(true)(3,5))
스위프트는 데이터 타입의 중첩이 자유롭습니다.
함수의 중첩은 함수 안에 함수를 넣을 수 있다는 의미인데, 함수 안에 구현된 중첩함수는 상위 함수의 몸통 블록 내부에서만 함수를 사용할 수 있습니다.
func sayHello(myName: String, yourName: String) {
func sayMyName(name: String) {
print("Hello, I'm \(name)")
}
func helloTo(name: String) {
print("Good moring \(name)~!")
}
sayMyName(name: myName)
helloTo(name: yourName)
}
sayHello(myName: "Lumi", yourName: "Asher")
스위프트에는 종료되지 않는 함수가 있습니다.
종료되지 않는다는 의미는 정상적으로 끝나지 않는 함수라는 뜻입니다.
이 함수를 실행하면 프로세스 동작은 끝났다고 볼 수 있습니다.