Swift의 함수는 일급함수인가?

Swift의 함수는 일급함수인가?
Photo by Sigmund / Unsplash

안녕하세요 :) Noah입니다.

Swift에서는 함수가 First-class Function으로써 사용됩니다.
Functional Programming a.k.a FP 에서 많이 언급되는 일급함수를 이번 기회를 통해 알아보고 정리해보는 시간을 가져보고자 합니다.

First-class Function이란 다음의 조건을 만족하는 함수를 의미합니다.
이에 대한 개념은 1960년대 중반 Christopher Strachey 에 의해 처음 등장했다고 합니다.

  1. 함수는 상수와 변수에 저장될 수 있다.
  2. 함수의 매개변수에 다른 함수를 인자로 전달할 수 있다.
  3. 함수는 함수의 반환 값이 될 수 있다.

이제 First-class Function의 조건을 하나씩 살펴보며,
Swift에서 함수가 First-class Function으로 취급되는지 확인해보겠습니다.

1. 함수는 상수와 변수에 저장 될 수 있다.

func foo() {
    print("foo")
}

let constPrintFoo = foo
var varPrintFoo = foo

constPrintFoo()
varPrintFoo()
// Prints foo
//        foo

2. 함수를 다른 함수에 인자로 전달할 수 있다.

func printOne() {
    print(1)
}

func printOneTwo(_ someFunction: () -> Void) {
    someFunction()
    print(2)
}

printOneTwo(printOne)
// Prints 1
//        2

3. 함수는 함수의 반환 값이 될 수 있다.

func printTrue() {
    print(true)
}

func printFalse() {
    print(false)
}

func printTrueOrFalse(_ isTrue: Bool) -> () -> (Void) {
    return isTrue ? printTrue : printFalse
}

let result = printTrueOrFalse(true)
result()
// Prints true

이러한 특성은 자바스크립트와 같은 동적 언어에서 보았던 기능인데,
Swift와 같은 정적 언어에서 이러한 방식을 지원하는 것이 상당히 흥미로웠습니다.

또한 함수 간 동등비교 연산에 관한 내용이 궁금하여 찾아본 결과,
이는 Swift에서 의도적으로 지원하지 않는 기능이라고 합니다.

Chris Lattner(LLVM, Swift를 만든 전설의 개발자!!) wrote on the developer forums: 링크

This is a feature we intentionally do not want to support. There are a variety of things that will cause pointer equality of functions (in the swift type system sense, which includes several kinds of closures) to fail or change depending on optimization. If ”===” were defined on functions, the compiler would not be allowed to merge identical method bodies, share thunks, and perform certain capture optimizations in closures. Further, equality of this sort would be extremely surprising in some generics contexts, where you can get reabstraction thunks that adjust the actual signature of a function to the one the function type expects.

Swift에서는 함수를 First-class Function으로 취급하기 때문에 map과 같은 high-order function을 사용할 수 있음을 이번 기회를 통해 알게 되었습니다. 🙂

혹시나 제가 잘못 알고 있는 부분이 있거나, 오타 혹은 궁금한 점 있으시면 댓글로 알려주시면 감사하겠습니다!!😎

참고 :
https://cocoacasts.com/swift-fundamentals-what-are-first-class-functions-in-swift
https://en.wikipedia.org/wiki/First-class_function