didSelectItemAt causes UI to reflow/redraw every time value for lastSelectedIndex is changed, causing performance issue. I'm not sure if I have used @State properly to propagate value from child to parent.
P.S. I need to use UICollectionView for a reason instead of swiftui List or ScrollView.
import Foundation
import SwiftUI
struct ContentView: View {
		@State var lastSelectedIndex : Int = -1
		var body: some View {
				ZStack {
						CustomCollectionView(lastSelectedIndex: $lastSelectedIndex)
						Text("Current Selected Index \(lastSelectedIndex)")
				}
		}
}
struct CustomCollectionView: UIViewRepresentable {
		@Binding var lastSelectedIndex : Int
		
		func makeUIView(context: Context) -> UICollectionView {
				let flowLayout = UICollectionViewFlowLayout()
				flowLayout.itemSize = CGSize(width: 400, height: 300)
				let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
				collectionView.register(CustomCollectionViewCell.self, forCellWithReuseIdentifier: CustomCollectionViewCell.reuseId)
				collectionView.delegate = context.coordinator
				collectionView.dataSource = context.coordinator
				collectionView.backgroundColor = .systemBackground
				collectionView.isDirectionalLockEnabled = true
				
				collectionView.backgroundColor = UIColor.black
				collectionView.showsVerticalScrollIndicator = false
				collectionView.showsHorizontalScrollIndicator = false
				collectionView.alwaysBounceVertical = false
				return collectionView
		}
		func updateUIView(_ uiView: UICollectionView, context: Context) {
				uiView.reloadData()
		}
		func makeCoordinator() -> CustomCoordinator {
				CustomCoordinator(self)
		}
}
class CustomCoordinator: NSObject, UICollectionViewDataSource, UICollectionViewDelegate {
		let parent:CustomCollectionView
		
		init(_ parent:CustomCollectionView) {
				self.parent = parent
		}
		
		func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
				100
		}
		func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
				let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CustomCollectionViewCell.reuseId, for: indexPath) as! CustomCollectionViewCell
				cell.backgroundColor = UIColor.red
				cell.label.text = "Current Index is \(indexPath.row)"
				NSLog("Called for Index \(indexPath.row)")
				return cell
		}
		
		func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
				parent.lastSelectedIndex = indexPath.row
		}
}
class CustomCollectionViewCell: UICollectionViewCell {
		static let reuseId = "customCell"
		let label = UILabel()
		override init(frame: CGRect) {
				super.init(frame: frame)
				label.numberOfLines = 0
				contentView.addSubview(label)
				label.translatesAutoresizingMaskIntoConstraints = false
				label.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
				label.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
				label.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
				label.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
		}
		required init?(coder aDecoder: NSCoder) {
				fatalError("init(coder:) has not been implemented")
		}
}
struct ContentView_Previews: PreviewProvider {
		static var previews: some View {
				ContentView()
		}
}