Wahib
Wahib

Reputation: 93

Swift: error: Unexpectedly found nil while implicitly unwrapping an Optional value

I'm getting this error code:

error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0). The process has been left at the point where it was interrupted, use "thread return -x" to return to the state before expression evaluation.

And the PlayGround said:

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file BilanDico-04.playground, line 137

Here's my code:

import Foundation
import UIKit

let TableauDesBesoinsQuotidienEnVitaminesretenues : [String : Float] = [
    "aRetinol"      : 800,
    "aBetacarotene" : 2100,
    "vitamineC"     : 80,
    "vitamineB1"    : 1.1,
    "calcium"       : 800,
    "omega3"        : 2
]

let TableauDesVitaminesRetenuesPourObjectifs : [String] = [
    "aRetinol",
    "aBetacarotene",
    "vitamineC",
    "vitamineB1",
    "calcium",
    "omega3"
]

class AlimentObject {
    var id = UUID().uuidString
    var nomAliment = "Nouvel aliment"
    var poids : Float = 100
    var calories : Float = 0
    var proteines : Float = 0
    var lipides : Float = 0
    var glucides : Float = 0
    var aRetinol : Float = 0
    var aBetacarotene : Float = 0
    var vitamineC : Float = 0
    var vitamineB1 : Float = 0
    var calcium : Float = 0
    var omega3 : Float = 0
    var comments : String = ""
    var premierBooleen: Bool
    var optimize: Bool
    
    init(nomAliment: String, poids: Float, calories: Float, proteines: Float, lipides: Float, glucides: Float, aRetinol: Float, aBetacarotene: Float, vitamineC: Float, vitamineB1: Float, calcium: Float, omega3: Float, comments:String, premierBooleen: Bool, optimize: Bool) {
        
        self.nomAliment = nomAliment
        self.poids = poids
        self.calories = calories
        self.proteines = proteines
        self.lipides = lipides
        self.glucides = glucides
        self.aRetinol = aRetinol
        self.aBetacarotene = aBetacarotene
        self.vitamineC = vitamineC
        self.vitamineB1 = vitamineB1
        self.calcium = calcium
        self.omega3 = omega3
        self.comments = comments
        self.premierBooleen = false
        self.optimize = false
    }
    
    convenience init() {
        self.init(nomAliment: "Aliment intialisé à zéro", poids: 100, calories: 0, proteines: 0, lipides: 0, glucides: 0, aRetinol: 0, aBetacarotene: 0, vitamineC: 0, vitamineB1: 0, calcium: 0, omega3: 0, comments: "", premierBooleen: false, optimize: false)
    }
}

class Donnees {
    
    static var AlimentListWithSections = [[AlimentObject]]()
    
    static let list1 = [
        AlimentObject(nomAliment: "Blanc de poulet", poids: 100, calories: 108, proteines: 24, lipides: 1, glucides: 0, aRetinol: 8, aBetacarotene: 0, vitamineC: 0, vitamineB1: 0.08, calcium: 8, omega3: 0.03, comments: "sdsdsdsdsd sdsddsdsd", premierBooleen: false, optimize: false),
        AlimentObject(nomAliment: "Avocat", poids: 100, calories: 147, proteines: 1.76, lipides: 13.80, glucides: 1.57, aRetinol: 0, aBetacarotene: 55, vitamineC: 5.49, vitamineB1: 0.05, calcium: 11.2, omega3: 0.08, comments: "aaaaaaaaa sdsddsdsd", premierBooleen: false, optimize: false),
        AlimentObject(nomAliment: "Amandes", poids: 100, calories: 634, proteines: 21, lipides: 53, glucides: 8, aRetinol: 8, aBetacarotene: 1, vitamineC: 0.8, vitamineB1: 0.18, calcium: 248, omega3: 0.06, comments: "fffffff sdsddsdsd", premierBooleen: false, optimize: false)
    ]
    
    static let list2 = [
        AlimentObject(nomAliment: "Poivron Jaune", poids: 100, calories: 29.2, proteines: 1, lipides: 5.42, glucides: 0.21, aRetinol: 0, aBetacarotene: 120, vitamineC: 184, vitamineB1: 0.03, calcium: 11, omega3: 0.02, comments: "lllllllssss", premierBooleen: false, optimize: false),
        AlimentObject(nomAliment: "Saumon cru", poids: 100, calories: 192, proteines: 20.5, lipides: 12.2, glucides: 0, aRetinol: 8, aBetacarotene: 0, vitamineC: 1.6, vitamineB1: 0.21, calcium: 8, omega3: 1.79, comments: "eeeeeeee", premierBooleen: false, optimize: false)
    ]
    
    static let list3 : [AlimentObject] = [
        AlimentObject(nomAliment: "Avocat", poids: 100, calories: 147, proteines: 1.76, lipides: 13.80, glucides: 1.57, aRetinol: 0, aBetacarotene: 55, vitamineC: 5.49, vitamineB1: 0.05, calcium: 11.2, omega3: 0.08, comments: "aaaaaaaaa sdsddsdsd", premierBooleen: false, optimize: false),
    ]
    
    static let list4 : [AlimentObject] = [
        AlimentObject(nomAliment: "Amandes", poids: 100, calories: 634, proteines: 21, lipides: 53, glucides: 8, aRetinol: 8, aBetacarotene: 1, vitamineC: 0.8, vitamineB1: 0.18, calcium: 248, omega3: 0.06, comments: "fffffff sdsddsdsd", premierBooleen: false, optimize: false)
    ]
    
    static let list5 : [AlimentObject] = []
    static let listVide : [AlimentObject] = []
    static let listDuJour = [list1, list2, list3, list4, list5]
}

class AlimentFunctions {
    // sommer des Float d'une macro du Menu et sortir un Float
    static func sumDUneMacroDuMenuToFloat(NameList list: [[AlimentObject]], macro: String) -> Float {
        var totalsection: Float = 0.0
        var total: Float = 0.0
        
        list.forEach {
            totalsection = 0
            $0.forEach({ (aliment) in
                if let value = Mirror(reflecting: aliment).children.first(where: { $0.label == macro })?.value as? Float {
                    totalsection += value
                }
            })
            total += totalsection
        }
        return total
    }
}


class TotauxVitamineMineraux {
    static func DicoDesTotauxPaffonesEtNonPlaffonesDesVitamines(with menu: [[AlimentObject]], tableauDesNomsDesMacrosRetenues: [String], tableauDesValeursDesMacros: [String: Float]) -> [String: (Float, Float, Float, Float, Float)] {
        var dico: [String: (Float, Float, Float, Float, Float)]!
        for macro in tableauDesNomsDesMacrosRetenues {
            let premier = tableauDesValeursDesMacros[macro]!
            let second = AlimentFunctions.sumDUneMacroDuMenuToFloat(NameList: menu, macro: macro)
            let troisieme = second / tableauDesValeursDesMacros[macro]! * 100
            var quatrieme = second
            if second > 100 { quatrieme = 100 }
            if second <= 100 { quatrieme = second }
            let cinquieme = quatrieme / tableauDesValeursDesMacros[macro]! * 100
            dico[macro] = (premier, second, troisieme, quatrieme, cinquieme)
        }
        return dico
    }
}

let dico = TotauxVitamineMineraux.DicoDesTotauxPaffonesEtNonPlaffonesDesVitamines(with: Donnees.listDuJour, tableauDesNomsDesMacrosRetenues: TableauDesVitaminesRetenuesPourObjectifs, tableauDesValeursDesMacros: TableauDesBesoinsQuotidienEnVitaminesretenues)

print(dico)

The error is in this line: dico[macro] = (premier, second, troisieme, quatrieme, cinquieme)

Upvotes: 0

Views: 235

Answers (1)

Phillip Mills
Phillip Mills

Reputation: 31026

var dico: [String: (Float, Float, Float, Float, Float)]! guarantees that this dictionary will exist, but nothing creates it. Then the program crashes when you try to put something into a nil dictionary that you've said will not be nil.

Upvotes: 1

Related Questions