mardi 28 mars 2017

If/Else based on existence of object in array?

I want to trigger an else statement if there is no object at the indexPath i look for in an array.

The array is

let exerciseSets = unsortedExerciseSets.sorted { ($0.setPosition < $1.setPosition) }

Then i use let cellsSet = exerciseSets[indexPath.row]

There is a chance, when a user is adding a new cell, that it wont already have an exerciseSet at the indexPath to populate it (adding a new set to an existing array of sets) and so I need to run an else statement to set up a blank cell rather than attempting to populate it and crashing my app.

However if i use if let then i get this error:

Initializer for conditional binding must have Optional type, not 'UserExerciseSet'

Here is the whole function for context if needed:

    func configure(_ cell: NewExerciseTableViewCell, at indexPath: IndexPath) {
    if self.userExercise != nil {
        print("RESTORING CELLS FOR THE EXISTING EXERCISE")
        let unsortedExerciseSets = self.userExercise?.exercisesets?.allObjects as! [UserExerciseSet]
        let exerciseSets = unsortedExerciseSets.sorted { ($0.setPosition < $1.setPosition) }

        if let cellsSet = exerciseSets[indexPath.row] { // this causes a creash when user adds new set to existing exercise as it cant populate, needs an else statement to add fresh cell
            cell.setNumber.text = String(cellsSet.setPosition)
            cell.repsPicker.selectRow(Int(cellsSet.setReps), inComponent: 0, animated: true)

            let localeIdentifier = Locale(identifier: UserDefaults.standard.object(forKey: "locale") as! String)
            let setWeight = cellsSet.setWeight as! Measurement<UnitMass>
            let formatter = MassFormatter()
            formatter.numberFormatter.locale = localeIdentifier
            formatter.numberFormatter.maximumFractionDigits = 2

            if localeIdentifier.usesMetricSystem {
                let kgWeight = setWeight.converted(to: .kilograms)
                let finalKgWeight = formatter.string(fromValue: kgWeight.value, unit: .kilogram)
                let NumericKgResult = finalKgWeight.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
                cell.userExerciseWeight.text = NumericKgResult
            } else {
                let lbsWeight = setWeight.converted(to: .pounds)
                let finalLbWeight = formatter.string(fromValue: lbsWeight.value, unit: .pound)
                let NumericLbResult = finalLbWeight.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.").inverted)
                cell.userExerciseWeight.text = NumericLbResult
            }

        } else {
            cell.setNumber.text = String((indexPath.row) + 1)
        }

Aucun commentaire:

Enregistrer un commentaire