1.개요
메서드 : 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수
함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수
스위프트는 재정의(오버라이드)와 중복정의(오버라이딩)를 모두 지원
함수는 일급객체이므로 하나의 데이터 타입으로 사용 될수 있다.
* 함수의 축약표현 helloWorld( name: String, times: Int ) -> String 이라는 함수가 있으면
helloWorld(name:times:) 라고 표현을 한다.
2. 함수 정의
함수를 선언할 때는 가장 앞에 func 키워드를 붙이고 (person: String) 파라미터와 형 그리고 -> String 형태로 반환형을 정의합니다.
func 함수이름(매개변수...) -> 반환타입 {
실행구문
return 반환 값
}
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
함수 내부의 코드가 단 한줄의 표현이고 그표현의 결과값의 타입이 함수의 반환타입과 일치한다면 return키워드를 생략가능하다
func greet(person: String) -> String {
"Hello, " + person + "!"
}
매개변수 없는 함수
func sayHelloWorld() -> String {
return "hello, world"
}
print(sayHelloWorld())
복수의 매개변수를 사용하는 함수
func greet(person: String, alreadyGreeted: Bool) -> String {
if alreadyGreeted {
return greetAgain(person: person)
} else {
return greet(person: person)
}
}
print(greet(person: "Tim", alreadyGreeted: true))
// Prints "Hello again, Tim!"
반환값이 없는 함수 (눈에 보이진 않지만 Void를 반환 , Void는 ()사용한 빈 튜플이라 보면됨)
func greet(person: String) {
print("Hello, \(person)!")
}
greet(person: "Dave")
// Prints "Hello, Dave!"
복수의 값을 반환하는 함수
//튜플을 함수의 반환 값으로 사용할 수 있습니다.
func minMax(array: [Int]) -> (min: Int, max: Int) {
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
//반환 값의 인자를 반환 값을 접근하는 접근자로 사용할 수 있습니다.
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")
// Prints "min is -6 and max is 109"
옵셔널 튜플 반환형
위의 반환 값과 달리 반환 값에 ? 물음표가 붙었습니다. (min: Int, max: Int)?
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
// 실제 반환 값에 접근하기 위해서는
// if let과 같은 옵셔널 체인을 사용하거나 강제 unwrapping을 해야 합니다.
// 아래는 옵셔널 체인을 사용한 예)입니다.
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}
// Prints "min is -6 and max is 109"
매개변수 이름과 전달인자 레이블
// 파라미터 앞에 인자 라벨을 지정해 실제 함수 내부에서 해당 인자를
// 식별하기 위한 이름과 함수 호출시 사용하는 이름을 다르게 해서 사용할 수 있습니다.
func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> 반환타입
{
// 이 안에서는 매개변수이름을 사용
실행구문
return 실행 값
}
// 호출시 전달인자레이블을 사용
함수이름(전달인자레이블: 전달값)
// ex1)
func someFunction(firstParameterName: Int, secondParameterName: Int) {
// 함수 내부에서 firstParameterName와 secondParameterName의 인자를 사용합니다.
}
someFunction(firstParameterName: 1, secondParameterName: 2)
// ex2) 매개변수 이름을 전달인자레이블로도 사용할 수 있다.
func greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)."
}
print(greet(person: "Bill", from: "Cupertino"))
// Prints "Hello Bill! Glad you could visit from Cupertino."
와이드카드( _ ) 를 사용하여 호출시 인자값 생략 할 수 있다.
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// 함수 안에서 firstParameterName, secondParameterName
// 인자로 입력받은 첫번째, 두번째 값을 참조합니다.
}
someFunction(1, secondParameterName: 2)
기본값이 있는 매개변수는 뒤에 위치시킨다. 중요한 매개변수는 앞쪽에 위치시킨다.
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
// 함수 호출시 두번째 인자를 생략하면 함수안에서
// parameterWithDefault값은 12가 기본 값으로 사용됩니다.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6)
// parameterWithDefault는 6
someFunction(parameterWithoutDefault: 4)
// parameterWithDefault는 12
집합매개변수(가변매개변수) 사용
함수마다 가변 매개변수는 하나만 가질 수 있다.
인자 값으로 특정 형(type)의 집합 값을 사용할 수 있습니다.
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5) // return 3.0
arithmeticMean(3, 8.25, 18.75) //return 10.0
인-아웃 파라미터 (입출력 매개변수) inout
값이 아닌 참조를 전달하려면 입출력 매개변수를 사용한다
( 정의시 매개변수 타입앞에 inout을 붙인다. 호출시 전달인자에는 &를 붙인다.)
입출력 매개변수는 매개변수 기본값을 가질수 없다.
가변매개변수로 사용 될 수 없다.
상수는 변경될수 없으므로 입출력 매개변수로 사용 될 수 없다.
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
//포인터를 넣는다고 생각
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"
스위프트 함수 더 공부해보기 아래링크를 눌러보세요
2021.03.10 - [공부/SWIFT] - [SWIFT] 함수는 일급객체이다.
'공부 > SWIFT' 카테고리의 다른 글
[SWIFT] 함수(종료되지 않는 함수, 반환값을 무시할 수 있는 함수) (0) | 2021.03.11 |
---|---|
[SWIFT] 함수(함수는 일급객체이다.) (0) | 2021.03.10 |
[SWIFT] 제어문( 반복문 while, repeat-while ) (0) | 2021.03.10 |
[SWIFT] 제어문( 반복문 for-in ) (0) | 2021.03.10 |
[SWIFT] 제어문(조건문 if , switch) (0) | 2021.03.10 |