티스토리 뷰
함수 형 (Function Types)
모든 함수는 매개변수(parameter)타입과 반환(return)타입으로 구성된 특정 타입을 갖고 있습니다.
아래 함수는 Int 타입을 받아 Int 타입을 반환하는 함수 입니다.
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
}
아래함수는 파라미터와 반환 값이 없는 함수입니다.
func printHelloWorld() {
print("hello, world")
}
함수 형의 사용 (Using Function Types)
함수를 상수, 변수처럼 정의해서 사용할 수 있습니다.
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a + b
}
var mathFunction: (Int, Int) -> Int = addTwoInts
print("result: ",mathFunction(3,5))
// result: 8
Swift의 타입 추론(Type Infered)으로 변수, 상수에 함수를 할당할 때 직접 함수 타입을 지정해주지 않아도 됩니다.
이미 addTwoInts가 (Int, Int) -> Int 인걸 Swift에서 타입 추론을 합니다.
파라미터 타입으로서의 함수 타입 (Function Types as Parameter Types)
파라미터에 함수를 사용할 수 있습니다.
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
return a * b
}
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
print("result: \(mathFunction(a, b))")
}
printMathResult(multiplyTwoInts, 3, 2)
// result: 6
위 예제에는 3가지 파라미터가 들어가는데,
첫번째 파라미터는 mathFunction(Int, Int) -> Int : Int 두개를 파라미터로 받아 Int를 리턴하는 함수타입의 파라미터,
두번째, 세번째는 Int를 받는 파라미터 입니다.
printMathResult 함수에 인자로 multiplyTwoInts (Int, Int) -> Int를 반환하는 함수 파라미터를 넣고
a에는 Int값 3을, b에는 Int값 2를 넣어 printMathResult 함수를 호출하게 되면
multiplyTwoInts함수의 인자값에는 3과 2가 들어가서 서로를 곱한값 6이 나오며
result: 6 이라는 프린트 결과 값이 나옵니다.
반환 타입으로서의 함수 타입 (Functions Types as Return Types)
함수를 반환하는 함수를 만들수도 있습니다.
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
위 두개의 함수는 Int 파라미터를 한개 받아, 파라미터 + 1 또는 -1 을 연산하는 함수입니다.
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
함수 형태가 기존과 다르게 보인다면 끊어서 읽으면 보기가 좀 편해집니다.
앞부분은 파라미터 뒤에는 리턴타입
chooseStepFunction함수는 파라미터로 Bool값을 받아 (Int) -> Int를 반환 합니다.
위 함수를 활용해서 예시를 들어보면
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
moveNearerToZero에서 backward를 보면 currentValue가 0보다 크니 true
true는 stepBackward() 함수를 가르키고 있습니다.
즉, currentValue (intput)값을 -1씩 빼는거죠.
위 내용을 이어서 좀 더 응용을 해보자면
아래는 currentValue가 0이 될때 까지 while 반복문을 사용한 예 입니다.
// 전체 로직
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
print(chooseStepFunction(backward: currentValue > 0) )
print("Counting to zero:")
while currentValue != 0 {
print("\(currentValue)..")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
while이 0이 아니면 반복문을 돌립니다.
moveNearerToZero는 아까 뭐였죠?
stepBackward를 반환하고
stepBackward는 Int를 받아서 Int 반환하는 함수였습니다.
다시 정리하면
이건 이렇게 풀어 쓸수 있겠네요.
currentValue = stepBackward(3)
근데 stepBackward는 Int를 받은값에 -1 한 값을 반환 하므로 이런모양 이겠죠. (3 - 1) -> 2
반환값은 2
즉 currentValue = 2
하지만 while != 0 조건에 걸려 계속 뺑뺑이
돌고 돌아 0까지 가서야
print("zero!")
를 뱉는겁니다.
중첩 함수 (Nested Functions)
Swift는 함수 내부에 또 다른 함수를 생성할 수 있습니다.
위에서 사용했던 chooseStepFunction을 아래와 같이 사용할 수도 있습니다.
func stepForward(_ input: Int) -> Int {
return input + 1
}
func stepBackward(_ input: Int) -> Int {
return input - 1
}
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
return backward ? stepBackward : stepForward
}
// ----------- 중첩 함수 사용 -----------------
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input -1 }
return backward ? stepBackward : stepForward
}
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
func stepForward(input: Int) -> Int { return input + 1 }
func stepBackward(input: Int) -> Int { return input - 1 }
return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero는 stepForward() 함수를 가르킵니다.
while currentValue != 0 {
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!
- currentValue가 0보다 작음으로 (false)
-> moveNearerToZero = stepForward(input: Int) -> Int - (while문) currentValue가 0이 아니면 반복문으로 진입
- currentValue = moveNearerToZero(currentValue) 는 아래와 같음
- currentValue = stepForward(-4) -> -3 ( currentValue가 0이 아니므로 반복)
- currentValue = stepForward(-4) -> -2 ( currentValue가 0이 아니므로 반복)
- currentValue = stepForward(-4) -> -1 ( currentValue가 0이 아니므로 반복)
- stop - print "zero!"
'iOS' 카테고리의 다른 글
ModerRIBs_tutorial 2 - 2 (0) | 2022.01.26 |
---|---|
ModernRIBs_tutorial2 - 1 (0) | 2022.01.23 |
[Swift] 함수 (Functions) (1) (0) | 2022.01.19 |
[Swift] 프로토콜 (Protocol) (0) | 2022.01.16 |
[iOS] #available(platform name version, *) (0) | 2022.01.14 |
- Total
- Today
- Yesterday
- swift property
- Swift 내림차순
- Swift 알고리즘
- iOS error
- CS 네트워크
- removeLast()
- RIBs tutorial
- Swift Leetcode
- Swift
- swift reduce
- Swift 프로퍼티
- Combine: Asynchronous Programming with Swift
- Swift 프로그래머스
- RTCCameraVideoCapturer
- Swift RIBs
- swift (programmers)
- 원티드 프리온보딩
- Class
- Swift joined()
- swift 고차함수
- swift protocol
- Swift final
- Swift Error Handling
- Swift ModernRIBs
- Swift joined
- ios
- Swift init
- swift programmers
- Swift inout
- 2023년 회고
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |