관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] reduce 연산자 사용 주의사항 (reduce(into:_:), reduce(_:_:), 문자열 사이 콤마 넣기) 본문

iOS 응용 (swift)

[iOS - swift] reduce 연산자 사용 주의사항 (reduce(into:_:), reduce(_:_:), 문자열 사이 콤마 넣기)

jake-kim 2024. 4. 29. 01:50

reduce 연산자

  • reduce 연산자는 배열과 같은 Collection type들을 하나씩 누적하며 하나의 값으로 만드는 연산자
    • reduce(into:_:)와 reduce(_:_:) 두가지가 존재

reduce(_:_:)와 reduce(into:_:)

  • reduce(_:_:)연산자
    • 배열과 같은 Collection Type을 순회하면서 하나의 값으로 만들어주는 연산자
      • 첫번째 인수에는 순회할때 축적되어야 하는 초기값
      • 두번째 인수에는 클로저를 주입하는데, 클로저의 첫번째 값은 순회할때마다 추적되고 있는 값이며 두번째 값은 순회하는 값

// ex

let arr = [1, 2, 3, 4, 5]

let val2 = arr.reduce(0) { result, element in
    result + element
}

let val1 = arr.reduce(0, +)
  • reduce(into:_:) 연산자
    • reduce(_:_:)와 유사해보이지만, 차이점은 클로저에 들어가는 첫번째 인수가 inout이므로 수정 되는 값

  • reduce(into:_:)는 클로저에서 값을 리턴해주는게 아니라 result를 계속해서 변경해주면서 순회하는것
let letters = "abracadabra"
let letterCount = letters.reduce(into: [:]) { result, letter in
    result[letter, default: 0] += 1
}
print(letterCount)
  • 주의사항)
    • reduce(into_:_:)와 reduce(_:_:) 두 개가 있을 때, inout을 사용하는 reduce(into:_:) 사용은 지양할 것 (값 타입 특성상 읽기와 쓰기가 동시에 일어나면 크래시가 나기 쉽기 때문)

번외) 문자열 사이 콤마넣기

  • 문자열 배열이 있을 때, 이 문자열들을 콤마로 이어지게 하고 싶은 경우?
    • reduce를 활용
  • 주의) 
    • 그냥 아래처럼 reduce를 사용하면 마치 두 문자열 사이에 콤마가 들어갈 것 같지만, reduce의 첫번째 인수는 초기값이므로 실수할 수 있음을 주의
["a", "b"].reduce(",", +) // ",ab"
  • reduce에 초기값을 ""로 주고, 직접 입력해줄 것
reduce("") { $0.isEmpty ? $1 : "\($0), \($1)" }

 

* 참고

- https://developer.apple.com/documentation/swift/array/reduce(into:_:)

- https://developer.apple.com/documentation/swift/array/reduce(_:_:)

Comments