Swift에는 수많은 함수들이 존재한다. 수많은 함수들을 분류하는 기준이 존재할까? 존재하다면 어떤 기준일까?
아래의 코드를 통해 분류 기준을 짐작할 수 있다.
func noParamsNoReturn() {}
func OneParamsNoReturn(param: String) {}
func noParamsHaveReturn() -> Int {
return 1
}
func oneParamsHaveReturn(param: String) -> String {
return param
}
func twoParamsHaveReturn(param1: Int, param2: Int) -> Int {
return param1 + param2
}
또한 위의 분류 기준을 통해 함수의 타입을 정의할 수 있며, 호출될 때 함수타입을 명시해야 한다.
Swift는 함수 타입이라는 것이 존재하며
(파라미터 타입, ...) -> 반환값
과 같이 나타낼 수 있다.
위의 함수들은 다음과 같은 타입을 가진다.
noParamsNoReturn()
: () -> Void
OneParamsNoReturn(param:)
: (String) -> Void
noParamsHaveReturn()
: () -> Int
oneParamsHaveReturn(param:)
: (Range<Int>) -> Void
twoParamsHaveReturn(param1:param2:)
: (Int, Int) -> Int
일급시민은 다음을 만족하는 친구를 뜻한다.
기본적으로 변수나 상수는 위의 조건을 만족하므로 일급시민이라 할 수 있다.
함수 또한 위의 조건을 만족하며, 일급시민이다.
Swift에 익숙하다면 고차함수 3대장 map
, reduce
, filter
를 알 것이다.
하지만 3대장의 내부 구현을 본 사람은 적을 것이다. 간단하게 map을 구현해보자.
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var result: [T] = []
self.forEach {
result.append(transform($0))
}
return result
}
}
print([1, 2, 3].myMap({ $0 + 5 })) // [6, 7, 8]
myMap 함수는 "Element라는 타입을 파라미터로 받아서 특정 타입 T로 반환하는 함수 ((Element) -> T)
"를 파라미터(그 파라미터의 이름은 transform이다.)로 받으며, T 타입의 배열을 리턴하는 함수이다.
내부적으로는 자기 자신, 즉 Array
를 순회하며 각각의 요소에 "어떤 동작"을 해주고, 반환될 배열에 추가하는 방식이다. 그 어떤 동작은 transform
에 정의하면 된다. 위 예시에서는 "각 요소에 5를 더해라" 라는 동작을 수행한다.