반응형
1. 기본 함수
스위프트에서는 매개변수의 타입이 다르면 같은 이름의 함수를 여러 개 만들 수 있습니다.
또 매개변수의 개수가 달라도 같은 이름의 함수를 만들 수 있습니다.
func hello(name: String) -> String {
return "Hello \(name)!"
}
let helloStark: String = hello(name: "Stark")
print(helloStark)
// "Hello Stark!"
func introduce(name: String) -> String {
"제 이름은 " + name + "입니다."
}
let helloThor: String = introduce(name: "Thor")
print(helloThor)
// 제 이름은 Thor입니다.
func plus100(num1: Int) -> Int {
num1 + 100
}
let num1: Int = plus100(num1: 20)
print(num1)
// 120
2. 전달인자 레이블
전달인자 레이블을 별도로 지정하면 함수 외부에서 매개변수의 역할을 좀 더 명확히 할 수 있습니다. 아래 예시로 살펴보겠습니다.
func heroName(realName name:String, heroName hero:String) -> String {
return "\(hero)의 진짜 이름은 \(name)입니다."
}
print(heroName(realName: "Tony Stark", heroName: "Ironman"))
// Ironman의 진짜 이름은 Tony Stark입니다.
"""
realName 과 heroName 은 전달인자 레이블이고
hero 와 name 은 매개변수 이름입니다.
함수 내부에서는 매개변수로 사용하고, 전달인자 레이블은 함수를 호출할 때 사용합니다.
"""
전달인자 레이블이 필요없는 경우에는 와일드카드 식별자를 사용합니다.
func greeceRomeMythology(_ godName: String, _ times: Int) -> String {
var result: String = ""
for _ in 0...times {
result += "The \(godName) is here!" + " "
}
return result
}
print(greeceRomeMythology("zeus", 3))
// The zeus is here! The zeus is here! The zeus is here! The zeus is here!
매개변수의 기본값을 지정하고 싶은 경우에는 "="를 사용합니다.
func greeceRomeMythology(godName: String, repeats: Int = 3) -> String {
var result: String = ""
for _ in 0...repeats {
result += "The \(godName) is here!" + " "
}
return result
}
print(greeceRomeMythology(godName: "Athena"))
// The Athena is here! The Athena is here! The Athena is here! The Athena is here!
print(greeceRomeMythology(godName: "Athena", repeats: 1))
// The Athena is here! The Athena is here!
3. 가변 매개변수와 입출력 매개변수
매개변수로 몇 개의 값이 들어올지 모를 때 가변 매개변수를 사용할 수 있습니다. 가변 매개변수는 0개 이상의 값을 받을 수 있고, 가변 매개변수로 들어온 인자 값은 배열처럼 사용할 수 있습니다. 함수마다 가변 매개변수는 하나만 가질 수 있습니다.
func myHeroes(me: String, heroes names: String...) -> String {
var result: String = "\(me)(이)가 좋아하는 히어로는 "
var heroes: String = ""
var endString: String = "입니다."
for hero in names {
heroes += hero + ","
}
return result + heroes + endString
}
print(myHeroes(me: "AXCE", heroes: "ironman", "hulk", "thor", "spiderman"))
// AXCE(이)가 좋아하는 히어로는 ironman,hulk,thor,spiderman,입니다.
4. 데이터 타입으로서의 함수
typealias CalculateTwoInts = (Int, Int) -> Int
func addTwoInts(_ a: Int, _ b: Int) -> Int {
a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
a * b
}
var mathFunction: CalculateTwoInts = addTwoInts
// ⬆️ var mathFunction: (Int, Int) -> Int = addTwoInts 와 같은 표현
print(mathFunction(10, 20))
// 30
mathFunction = multiplyTwoInts
print(mathFunction(10, 20))
// 200
func printMathResult(_ mathFunction: CalculateTwoInts, _ a: Int, _ b: Int) {
print("Result: \(mathFunction(a, b))")
}
printMathResult(mathFunction, 10, 40)
// Result: 400
특정 조건에 따라 적절한 함수를 반환해주는 함수를 만들 수 있습니다. 위의 코드와 이어서 작성된 코드입니다.
func chooseMathFunction(_ toAdd: Bool) -> CalculateTwoInts {
return toAdd ? addTwoInts : multiplyTwoInts
}
printMathResult(chooseMathFunction(true), 10, 50)
// Result: 60
printMathResult(chooseMathFunction(false), 10, 70)
// Result: 700
아래는 함수를 중첩으로 사용한 중첩 함수입니다.
typealias MoveFunc = (Int) -> Int
func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
func goRight(_ currentPosition: Int) -> Int {
return currentPosition + 1
}
func goLeft(_ currentPosition: Int) -> Int {
return currentPosition - 1
}
// True 일 경우 goLeft 라는 함수를 리턴해야 하기 때문에 MoveFunc 라는 함수 타입을 사용해야 한다.
return shouldGoLeft ? goLeft : goRight
}
var position: Int = -4
let moveToZero: MoveFunc = functionForMove(position > 0)
while position != 0 {
print("\(position)...")
// moveToZero는 MoveFunc라는 함수 타입이기 때문에 Int를 받아 Int를 반환한다.
position = moveToZero(position)
}
print("원점 도착!!")
"""
-4...
-3...
-2...
-1...
원점 도착!!
"""
[출처: 야곰 SWIFT 스위프트 프로그래밍 (swift 5)]
반응형
'Mobile > Swift' 카테고리의 다른 글
[Swift - 문법] 프로퍼티(Property) - 1. 저장 프로퍼티 (0) | 2022.11.13 |
---|---|
[Swift - 문법] 구조체와 클래스 (0) | 2022.11.11 |
[Swift - 문법] 반복문(for-in, while) (0) | 2022.11.09 |
[Swift - 문법] 조건문 (if , switch) (0) | 2022.11.09 |
[Swift - 문법] 삼항 조건 연산자와 범위 연산자 (0) | 2022.11.09 |