Computer >> 컴퓨터 >  >> 스마트폰 >> iPhone

Swift의 Map, Filter, Reduce에 대한 비하인드 스토리 살펴보기

함수는 입력을 받아서 그에 대해 뭔가를 하고 출력을 생성합니다. 함수에는 서명과 본문이 있습니다. 함수에 동일한 입력을 제공하면 항상 동일한 출력을 얻습니다. 이것은 간단히 말해 기능에 대한 정의입니다. .

이제 우리는 기능에 대해 자세히 살펴봄으로써 기능에 대해 더 많이 이야기할 것입니다. 우리는 Swift에서 고차 함수를 탐색할 것입니다. 다른 함수를 입력으로 받거나 함수를 반환하는 함수를 이라고 합니다. 고차 함수 .

Swift에서는 지도, 필터링, 축소를 사용합니다. 매일. 이러한 기능을 사용할 때 마술처럼 보입니다. 이 시점에서 당신은 무대 뒤에서 무슨 일이 일어나고 있는지 모를 수 있습니다. 함수형 프로그래밍의 아이디어와 접근 방식을 통해 매핑, 필터링 및 축소 작업을 수행합니다. Swift는 순수한 함수형 언어는 아니지만 함수형 언어를 사용할 수 있습니다.

이제 배경에서 어떤 일이 일어나고 있는지 하나씩 살펴 보겠습니다. 먼저 일부 특정 데이터 유형에 대해 이러한 함수의 기본 버전을 구현한 다음 일반 버전을 구현하려고 합니다.

지도 기능

정수 배열이 있고 원래 배열의 각 요소에 약간의 델타 값을 추가한 후 새 배열을 반환하는 함수를 작성해야 한다고 가정해 보겠습니다. 아래와 같은 간단한 for 루프를 사용하여 이를 위한 함수를 쉽게 작성할 수 있습니다.

이제 원래 배열의 각 요소를 두 배로 늘려 새 배열을 반환하는 또 다른 함수가 필요합니다. 이를 위해 아래와 같이 구현할 수 있습니다.

위의 두 함수를 살펴보면 기본적으로 같은 일을 하고 있음을 알 수 있습니다. for 루프 내부의 기능만 다릅니다. 둘 다 정수를 취합니다. 배열을 입력으로 사용하고 for 루프를 사용하여 각 요소를 변환하고 새 배열을 반환합니다. 따라서 기본적으로 가장 중요한 것은 각 요소를 새로운 것으로 변환하는 것입니다.

Swift는 고차 함수를 지원하기 때문에 정수 배열을 취하고 함수를 입력으로 변환하고 원래 배열의 각 요소에 변환 함수를 적용하여 새 배열을 반환하는 함수를 작성할 수 있습니다.

그러나 여전히 위의 문제가 있습니다. 정수 배열만 반환합니다. 예를 들어, 입력 정수 배열을 문자열 배열로 변환해야 하는 요구 사항이 있는 경우 이 함수로 그렇게 할 수 없습니다. 그렇게 하려면 모든 유형에서 작동하는 일반 함수를 작성해야 합니다.

다음과 같이 Array 확장에서 일반 함수를 구현할 수 있습니다.

  1. 일반 유형 T와 함께 작동하는 Array Extension의 맵 함수 선언 .
  2. 함수는 (요소) -> 유형의 함수를 사용합니다. T를 입력으로
  3. T를 포함하는 빈 결과 배열 선언 함수 내부의 유형 데이터입니다.
  4. 자체를 반복하는 for 루프를 구현하고 변환 함수를 호출하여 요소를 T 유형으로 변환합니다.
  5. 변환된 값을 결과 배열에 추가

지도 함수는 Swift에서 작동합니다. 지도 를 구현해야 하는 경우 기능, 그런 다음 위와 같이 구현합니다. 따라서 기본적으로 배열에서 마법 같은 일이 발생하지 않습니다. 우리 스스로 쉽게 함수를 정의할 수 있었습니다.

필터 기능

정수 배열이 있고 배열에 짝수만 유지하려고 한다고 가정합니다. 간단한 for 루프를 사용하여 이것을 구현할 수 있습니다.

이제 다시 프로젝트의 클래스 파일 이름을 나타내는 문자열 배열이 있고 만 유지하려고 한다고 가정해 보겠습니다. 신속 파일. 이것은 아래와 같은 단일 루프로도 수행할 수 있습니다.

위의 두 함수의 구현을 자세히 살펴보면 기본적으로 동일한 작업을 수행한다는 것을 이해할 수 있습니다. 두 배열의 데이터 유형만 다릅니다. 배열과 함수를 입력으로 사용하고 includeElement의 출력에 따라 일반 필터 함수를 구현하여 이를 일반화할 수 있습니다. 함수에서 결과 배열에 요소를 추가할지 여부를 결정합니다.

감소 기능

정수 배열이 있고 요소의 합과 곱을 반환하는 두 가지 함수를 구현하려고 한다고 가정합니다. 간단한 for 루프를 사용하여 이것을 구현할 수 있습니다.

이제 정수 배열을 사용하는 대신 문자열 배열이 있고 배열의 모든 요소를 ​​연결하려고 한다고 가정해 보겠습니다.

세 가지 기능 모두 기본적으로 동일한 작업을 수행합니다. 배열을 입력으로 받아 결과 변수를 초기화하고 배열을 반복하고 결과 변수를 업데이트합니다.

여기에서 우리는 모두에게 작동해야 하는 일반 기능을 구현할 수 있습니다. 이렇게 하려면 결과 변수의 초기 값과 모든 반복에서 해당 변수를 업데이트하는 함수가 필요합니다.

따라서 다음 정의를 사용하여 일반 함수를 구현할 수 있습니다.

위의 구현은 [요소] 유형의 모든 입력 배열에 대해 일반적입니다. T 유형의 결과를 계산합니다. . 작동하려면 T 유형의 초기 값이 필요합니다. 결과 변수에 할당합니다. 그런 다음 (T, Element) -> 유형의 함수가 필요합니다. T는 결과 변수를 업데이트하기 위해 각 반복의 for 루프 내부에서 사용됩니다.

읽어주셔서 감사합니다!