평균값을 구해야 하는데, avg나 적어도 sum이 아예 안먹혀버리는 것이다.
찾아봤더니 reduce() 메서드를 사용하면 된다고.
사실 반복문 사용해도 되긴 하는데 편해보이길래 가져와봤다.
여러 사용 예시를 통해 사용법을 알아보자.
import Foundation
func solution(_ numbers:[Int]) -> Double {
let sum = Double(numbers.reduce(0,+))
let len = Double(numbers.count)
return sum / len
}
reduce의 첫 번째 인자 '0': python에서 sum = 0 으로 변수 선언해주고 시작하는 거랑 비슷한 느낌으로 0에 이후 값들을 더한다는 의미이다.
reduce의 두 번째 인자 '+': 이후 값을 더한다는 뜻의 축약형 클로저.
비슷하게 배열의 곱을 구하고자 한다면,
let a = numbers.reduce(1, *)
와 같이 쓸 수 있겠다.
❗️ 참고로 swift에서 배열의 길이를 구하고 싶다면 len(array)가 아닌 array.count를 사용하면 된다.
let words = ["Swift", "is", "awesome"]
let sentence = words.reduce("") { $0 + " " + $1 }.trimmingCharacters(in: .whitespaces)
print(sentence) // "Swift is awesome"
위 코드의 경우, $0 에서는 초기값 또는 축적값을 받고, $1은 배열에서 현재 처리중인 요소를 가져오는 방식으로 두 개의 인자를 이용하고 있다.
뒤의 trimmingCharacters은 문자열 전후의 공백을 지워주는 역할!
위 배열의 평균값 예시처럼, reduce() 안에 두 개의 인자를 모두 입력해도 된다.
let sentence = words.reduce("", { $0 + " " + $1 })
그러나 뒤의 클로저가 길어질 경우, 해당 예시처럼 뒤로 빼기도 한다고 한다.
❗️ 클로저는 여기에서 간단하게 느낌만 알고 넘어갔지만 써 본 적이 아직 별로 없기때문에 익숙해져야 한다!!
클로저 내에서는 $0, $1 과 같은 단축 인자 이름을 사용한다.
- 두 개의 인자를 이용할 경우, 클로저에 전달된 첫 번째 인자를 $0, 두 번째 인자를 $1로 받아 처리한다.
- 여러 인자가 있는 경우, 첫 번째 인자를 $0, 두 번째 인자를 $1, 세 번째 인자를 $2... 등으로 받기도 한다.
이쯤 이해하니 뒤의 예시들은 보면 아!하고 이해가 잘 된다.
let numbers = [3, 5, 1, 6, 2, 7, 4]
let maxNumber = numbers.reduce(numbers[0]) { $0 > $1 ? $0 : $1 }
print(maxNumber)
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let evenSum = numbers.reduce(0) { $1 % 2 == 0 ? $0 + $1 : $0 }
print(evenSum)
swift의 reduce()에 대해 알아보았는데, 클로저의 단축 인자에 대해 더 이해하게 되는 계기가 되었다.