Erreur Swift: valeur du type facultatif 'Double?' pas déballé

Je suis novice dans Swift, quelle est cette erreur:

let lvt=self?.lastVibrationTime let delta=self!.deltaTime let sens=self!.shakeSensitivity let time:Double = CACurrentMediaTime() //error is on `lvt` and says : Error:(37, 27) value of optional type 'Double?' not unwrapped; did you mean to use '!' or '?'? if time - lvt > delta && data.userAcceleration.x < sens { println("firmly shaken!") self?.vibrateMe() } 

Quand vous écrivez let lvt=self?.lastVibrationTime lorsque vous utilisez self? votre variable lvt est optionnelle, vous devez la déplier avant de l'utiliser, vous avez beaucoup de solutions pour corriger cette erreur:

 1. let lvt = self?.lastVibrationTime ?? 5 // 5 is the default value, you can use the value you want 2. let lvt = self!.lastVibrationTime 3. You can unwrap the value before use it: if let lvt = self?.lastVibrationTime { // your code here... } 

Toutes vos options doivent être déballées. Donc, lvt devrait devenir lvt!

Word of Caution Développer un optionnel qui n'a pas de valeur lancera une exception. Donc, ce pourrait être une bonne idée de s'assurer que votre lvt n'est pas nul.

 if (lvt != nil) 

Avec cette ligne:

 let lvt = self?.lastVibrationTime 

Vous reconnaissez que vous êtes facultatif. Donc, si c'est nil alors lvt serait nul; Si le self n'est pas nil , alors vous aurez le dernier time de vibration. A cause de cette ambiguïté, lvt n'est pas de type Double mais optionnel, Double? .

Si vous êtes certain que le self ne sera pas nul, vous pouvez forcer le déballer:

 let lvt = self!.lastVibrationTime // lvt is a Double 

Si le self est nul, l'application va planter ici.

Pour être sûr, vous pouvez utiliser la binding optionnelle pour vérifier la valeur:

 if let lvt = self?.lastVibrationTime { // do the comparison here } 

Cela signifie que vous pourriez avoir besoin d'un else cas ici si vous avez du code à exécuter dans le cas de zéro.