How do I got Multiple Selections in UICollection View using Swift 4

Well, the best way to handle multiple selections in UICollectionView

1) Enable Multiple Selection

myCollectionView.allowsMultipleSelection = true

2) override isSelected var in your custom cell class

override var isSelected: Bool {
        didSet {
            if self.isSelected {
                backgroundColor = UIColor.red
            }
            else {
                backgroundColor = UIColor.purple
            }
        }
    }

3) and you can get the selected indexPath items

let items = myCollectionView.indexPathsForSelectedItems

This basic example. You can change as per your data.

When you select any cell then you need to check that selected cell is already selected before or not.

If not then add selected cell indexPath in indexArray and selected cell value in valueArray.

If current selected cell is previously selected then remove indexPath from indexArray and also remove selected cell value from valueArray

on continue button press pass arrSelectedData to server or next screen.

Define below 3 array.

var arrData = [String]() // This is your data array
var arrSelectedIndex = [IndexPath]() // This is selected cell Index array
var arrSelectedData = [String]() // This is selected cell data array

//UICollectionView Delegate & DataSource

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 
{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.arrData.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell

        if arrSelectedIndex.contains(indexPath) { // You need to check wether selected index array contain current index if yes then change the color
            cell.vw.backgroundColor = UIColor.red
        }
        else {
            cell.vw.backgroundColor = UIColor.lightGray
        }

        cell.layoutSubviews()
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 100, height: 100)
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("You selected cell #\(indexPath.item)!")

        let strData = arrData[indexPath.item]

        if arrSelectedIndex.contains(indexPath) {
            arrSelectedIndex = arrSelectedIndex.filter { $0 != indexPath}
            arrSelectedData = arrSelectedData.filter { $0 != strData}
        }
        else {
            arrSelectedIndex.append(indexPath)
            arrSelectedData.append(strData)
        }

        collectionView.reloadData()
    }
}

You can write the code like this to Enable Multiple Selection :-

yourCollectionViewName.allowsMultipleSelection = true   

then you can Do it like this to see the cell Selected -

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    var cell = collectionView.cellForItemAtIndexPath(indexPath)
    if cell?.selected == true {
        cell?.backgroundColor = UIColor.orangeColor()
    }
}

To Deselect You can do something Like this -

func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {        
   var cell = collectionView.cellForItemAtIndexPath(indexPath)
   cell?.backgroundColor = UIColor.clearColor()
}