함수와 메서드
함수와 메서드는 같습니다. 상황이나 위치에 따라 다른 용어로 부르는 것입니다.
구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수를 메서드
모듈 전체에서 전역적으로 사용할 수 있는 함수를 그냥 함수라고 부릅니다!
함수는 func 키워드를 사용해서 정의합니다.
또한 ->를 사용해서 함수의 반환 타입을 지정합니다.

Swift에서는 함수를 호출할 때 파라미터 이름을 같이 써주어야 합니다!
hello(name: "sdab", time:3) 이렇게요.
스위프트의 함수는 자유도가 굉장히 높다고 볼 수 있을 것 같습니다!

위 처럼 함수 안에 함수를 또 작성할 수도 있고

함수 안에 정의했었던 함수를 반환할 수도 있습니다!
위에서는 heeloGenerator 함수의 반환 타입이 중요합니다.
문자열을 받아서 문자열을 반환하는 함수를 반환하는 함수입니다.
매개변수
스위프트의 함수는 매개변수를 어떻게 정의하냐에 따라서도 모습이 크게 달라집니다.

매개변수가 없는 함수의 정의 및 사용
위의 코드는 매개변수가 없는 함수의 사용입니다.
만약 매개변수가 여러 개 필요한 함수를 정의할 때는 쉼표로 매개변수를 구분합니다.
주의할 점은 함수를 호출할 때, 매개변수 이름을 붙여주고 콜론(:)을 적어준 후 전달인자를 보내준다는 점입니다.
이렇게 호출 시에 매개변수에 붙이는 이름을 매개변수 이름이라고 합니다.

매개변수가 여러 개인 함수
위의 코드는 매개변수가 여러 개 있는 함수를 구현한 것 입니다!
클로저 (Closure)
클로저를 사용하면 코드를 조금 더 간결하게 만들 수 있습니다.
클로저는 중괄호로 감싸진 '실행 가능한 코드 블럭'입니다.
예시를 들어보겠습니다.

이러한 코드를 클로저를 사용하면 어떻게 변할까요?

이렇게 변할 수 있습니다.
함수와는 다르게 함수 이름 정의가 따로 존재하지 않습니다. 하지만 파라미터를 받을 수 있고, 반환 값이 존재할 수 있다는 점에서
함수와 동일합니다.
즉! 함수는 이름이 있는 클로저라고 생각을 할 수도 있겠지요!
위 함수에서 클로저는 중괄호로 감싸져있습니다. 또한 파라미터를 괄호로 감싸서 정의하며, ->를 사용해서 반환 타입을 명시중입니다.
조금 다른 점은 in 키워드를 사용해서 파라미터, 반환 타입 영역과 실제 클로저의 코드를 분리중입니다.
그런데 ....
그냥 거기서 거기같다는 느낌을 빠질 수 없을 것 같습니다.
하지만 클로저의 장점은 " 간결함과 유연함 " 입니다
Swift 컴파일러의 타입 추론 덕에, helloGenerator() 함수에서 반환하는 타입을 가지고 클로저에서 어떤 파라미터를 받고
어떤 타입을 반환하는지를 알 수 있습니다!
과감하게 생략이 가능합니다.

이렇게 간략하게도 가능합니다!
여기서도 타입 추론 덕분에 처음과 두번 째 파라미터가 모두 문자열이라는 것을 알 수 있습니다.
여기서 첫번 째 파라미터는 $0 / 2번째는 $1로 바꿀 수 있습니다!

만약 클로저 내부의 코드가 한 줄이라면 return까지도 생략이 가능합니다!

저 위의 코드가 이렇게나 간결해졌습니다!
클로저를 변수처럼 정의

변수처럼 정의할 수 있습니다.
클로저를 옵셔널로 정의 (옵셔널 체이닝도 가능)

그래서 클로저는 어떻게 써야하지...?
클로저는 Swift에서 많은 곳에서 사용됩니다.
sort() / filter() 와 같은 배열에 많이 쓰이고
대표적인 메서드로는 sort(), filter(), map(), reduce()가 있습니다.
이 중에서
map()
파라미터로 받은 클로저를 모든 요소에 실행하고, 그 결과를 반환합니다.
정수 배열의 모든 요소들에 2를 더한 값으로 이루어진 배열을 만들고 싶다면!

reduce()
초깃값이 주어지고, 초깃값과 첫 번 째 요소의 클로저 실행 결과, 그리고 그 결과와 두 번째 요소의 클로저 실행 결과
그리고 그 결과와 세 번째 요소의 클로저 실행 결과, 끝까지 실행한 후의 값을 반환합니다.
위에서 정의한 arr1의 요소의 합을 구하고 싶다면 !

위와 같이 작성할 수 있겠네요.
첫 번째 인자로 주어진 0부터 시작해서, 각 요소들과의 주어진 클로저에 대한 실행 결과를 바로 다음 요소와 실행합니다.
처음에는 0과 1을 더해서 1, 그 결과인 1과 3을 더해서 4 .. . .이렇게 진행되면 28이 반환됩니다.
** Swift에서는 연산자도 함수입니다.
함수는 곧 클로저
그러니까 연산자는 클로저.
1 + 2를 실행한다면
+라는 이름을 가진 연산자 함수가 실행!!
파라미터로는 1과 2가 넘겨지고
+함수는 파라미터 두 개의 합을 반환하는 클로저입니다.
즉 ($0 + $1) 입니다.
+라는 연산자를 클로저로 넘기는 것입니다.

이렇게도 !
여기까지 스위프트의 함수, 클로저에 대해서 간단하게 알아보았습니다!
'ios' 카테고리의 다른 글
Swift - 구조체 / 클래스 (0) | 2022.12.31 |
---|---|
Swift - 반복문(for in, repeat while)| (0) | 2022.12.20 |
Pod init error (0) | 2022.12.15 |
Swift - Alamofire? (0) | 2022.12.15 |
Swift - Optional(옵셔널) 이란? (0) | 2022.12.15 |