Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Force casts should be avoided

I am getting "Force cast violation : Force casts should be avoided warning" on my code :

daysCombinedFinal = daysCombined[0] as! [Any?]

The screenshot is attached below:

The warning shown is in the image

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if  let cell = tableView.dequeueReusableCell(withIdentifier: "location", for: indexPath) as? TravelShopCustomCell {
        if !isFirstTime && self.nameArray.count != 0 {
            var daysCombined = [Any]()
            var daysCombinedFinal = [Any?]()
            daysCombined = [self.combinedArray[0]]
            daysCombinedFinal = daysCombined[0] as? [Any?] ?? []
            let str = daysCombinedFinal.flatMap { $0 as? String }.joined(separator:" ")
            var startAMCombined = [Any]()
            var startAMCombinedFinal = [Any?]()
            startAMCombined = [self.combinedStartAMArray[0]]
            startAMCombinedFinal = startAMCombined[0] as? [Any?] ?? []
            var endPMCombined = [Any]()
            var endPMCombinedFinal = [Any?]()
            endPMCombined = [self.combinedEndPMArray[0]]
            endPMCombinedFinal = endPMCombined[0] as? [Any?] ?? []
            cell.operatingDaysLabel.text = str
            let isAMEqual = checkArrayStatus(testArray: [startAMCombinedFinal as Any])
            let isPMEqual = checkArrayStatus(testArray: [endPMCombinedFinal as Any])
            if isAMEqual && isPMEqual {
                self.mergedArray = arrayMerger(array1: startAMCombinedFinal, array2: endPMCombinedFinal)
            }
            let startTimeString = self.mergedArray[0] as? String
            let endTimeString = self.mergedArray[1] as? String
            cell.operatingTimeLabel.text = startTimeString! + " - " + endTimeString!
            return cell
        } else if isFirstTime && self.nameArray.count != 0 {
            var daysCombined = [Any]()
            var daysCombinedFinal = [Any?]()
            daysCombined = [self.combinedArray[indexPath.row]]
            daysCombinedFinal = daysCombined[0] as! [Any?]
            let str = daysCombinedFinal.flatMap { $0 as? String }.joined(separator:" ")
            var startAMCombined = [Any]()
            var startAMCombinedFinal = [Any?]()
            startAMCombined = [self.combinedStartAMArray[indexPath.row]]
            startAMCombinedFinal = startAMCombined[0] as! [Any?]
            var endPMCombined = [Any]()
            var endPMCombinedFinal = [Any?]()
            endPMCombined = [self.combinedEndPMArray[indexPath.row]]
            endPMCombinedFinal = endPMCombined[0] as! [Any?]
            cell.operatingDaysLabel.text = str
            let isAMEqual = checkArrayStatus(testArray: [startAMCombinedFinal as Any])
            let isPMEqual = checkArrayStatus(testArray: [endPMCombinedFinal as Any])
            if isAMEqual && isPMEqual {
                self.mergedArray = arrayMerger(array1: startAMCombinedFinal, array2: endPMCombinedFinal)
            }
            let startTimeString = self.mergedArray[0] as? String
            let endTimeString = self.mergedArray[1] as? String
            cell.operatingTimeLabel.text = startTimeString! + " - " + endTimeString!
            return cell
        }
        return cell
    } else {
        fatalError("Dequeueing SomeCell failed")
    }
}

The array declaration is:

var dateArray = [Any]()
var endAmTimeArray = [Any]()
var endPmTimeArray = [Any]()
var startAmTimeArray = [Any]()
var startPmTimeArray = [Any]()
var combinedArray = [Any]()
var combinedStartAMArray = [Any]()
var combinedEndPMArray = [Any]()
var mergedArray = [Any?]()
like image 931
Freshley Kremp Avatar asked Apr 26 '26 13:04

Freshley Kremp


1 Answers

Your problem has relation with concept of 'optional' & 'unwrapper'. Here is brief about both and difference between them: How to understand ! and ? in swift?

? (Optional) indicates your variable may contain a nil value while ! (unwrapper) indicates your variable must have a memory (or value) when it is used (tried to get a value from it) at runtime.

In your case, you are trying to get value from array using index number. Now type of elements of your array is 'Any'

So, there may be any kind of value/information contained by element of array. It will result into app crash, if you try to force unwrap a value of element, when it won't return a value or value with type that you're casting with unwrapper.

Here is basic tutorial in detail, by Apple Developer Committee.

This warning is indicating you, that your app may crash on force unwrapping optional value.

As a solution you should use ? (optional) with if-let block, to avoid force unwrapping and safe execution of your code, like:

if let daysC = daysCombined[0] as? [Any] {
    daysCombinedFinal = daysC
}

Share your full source code, to get better solution of your query as you have not shared declaration of your array in your question. Because I've confusion about optional array [Any?] elements. Swift not allows array elements as optional.

Update : By considering elements of all arrays as 'Dictionary < String : Any >', forced unwraps from array assignments are removed here.

var daysCombined = [Any]()
var daysCombinedFinal = [Any?]()
daysCombined = [self.combinedArray[indexPath.row]]

// Update 1
// if combinedArray is an array of array
if let arrayElement = daysCombined[0] as? [Any] {
    daysCombinedFinal = arrayElement
}
let str = daysCombinedFinal.flatMap { $0 as? String }.joined(separator:" ")
var startAMCombined = [Any]()
var startAMCombinedFinal = [Any?]()
startAMCombined = [self.combinedStartAMArray[indexPath.row]]

// Update 2
if let arrayElement = startAMCombined[0] as? [Any] {
    startAMCombinedFinal = arrayElement
}
var endPMCombined = [Any]()
var endPMCombinedFinal = [Any?]()
endPMCombined = [self.combinedEndPMArray[indexPath.row]]

// Update 3
if let arrayElement = endPMCombined[0] as? [Any] {
    endPMCombinedFinal = arrayElement
}

cell.operatingDaysLabel.text = str
like image 88
Krunal Avatar answered Apr 28 '26 03:04

Krunal