[swift] Swift DeepDiff를 활용하여 서버로부터 받은 데이터 필터링하기
많은 경우 웹 서비스나 앱에서 서버로부터 받은 데이터를 다양한 방법으로 필터링해야 할 때가 있습니다. 이 때 DeepDiff 라이브러리를 사용하면 간편하게 변경 사항을 탐지하고 필터링 할 수 있습니다.
DeepDiff란?
DeepDiff는 Swift에서 사용할 수 있는 패키지로서 컬렉션이나 객체의 변경 사항을 탐지합니다. 이 라이브러리는 이전과 현재의 데이터 집합을 비교하여 추가, 삭제 및 변경된 요소를 식별할 수 있습니다.
DeepDiff 사용법
먼저 DeepDiff 라이브러리를 프로젝트에 추가해야 합니다. DeepDiff GitHub에서 패키지를 다운로드하거나 CocoaPods 등의 패키지 매니저를 활용하여 설치할 수 있습니다.
import DeepDiff
...
let oldData = [1, 2, 3, 4, 5]
let newData = [3, 4, 5, 6, 7]
let changes = diff(old: oldData, new: newData)
두 개의 배열을 비교하고 diff 함수를 사용하여 변경된 결과를 얻을 수 있습니다. 이를 통해 changes
변수에는 이전 데이터와 현재 데이터 간의 변경 사항이 담겨집니다.
필터링 예제
이제 실제로 서버로부터 받은 데이터를 필터링하는 예제를 살펴보겠습니다.
import DeepDiff
struct Product: Hashable {
let id: Int
let name: String
}
let oldProducts = [Product(id: 1, name: "Apple"), Product(id: 2, name: "Banana"), Product(id: 3, name: "Orange")]
let newProducts = [Product(id: 1, name: "Apple"), Product(id: 3, name: "New Orange"), Product(id: 4, name: "Grapes")]
let changes = diff(old: oldProducts, new: newProducts)
for change in changes {
switch change {
case .insert(let insertIndexes):
for index in insertIndexes {
let product = newProducts[index]
print("추가된 제품: \(product.name)")
}
case .delete(let deleteIndexes):
for index in deleteIndexes {
let product = oldProducts[index]
print("삭제된 제품: \(product.name)")
}
case .replace(_, let deleteIndexes, let insertIndexes):
for deleteIndex in deleteIndexes {
let deletedProduct = oldProducts[deleteIndex]
print("삭제된 제품: \(deletedProduct.name)")
}
for insertIndex in insertIndexes {
let insertedProduct = newProducts[insertIndex]
print("추가된 제품: \(insertedProduct.name)")
}
}
}
위의 예제에서는 Product 구조체를 사용하여 제품들을 비교하고 변경된 제품들을 필터링합니다. 변경된 제품들을 추가 또는 삭제 여부에 따라 다른 로직을 수행할 수 있습니다.
DeepDiff 라이브러리를 사용하면 서버로부터 받은 데이터의 변경 사항을 탐지하고 필터링할 수 있습니다. 이렇게 함으로써 앱이나 웹 서비스에서 동적으로 데이터를 처리하고 적용할 수 있게 됩니다.
참고문헌