2017-05-24 2 views
0

Je suis nouveau à Swift et j'ai cherché quelques-unes à travers les réponses que j'ai vues à ce sujet, mais j'essaie de trouver comment corriger ce problème. J'ai un terrain de jeu Swift avec du code qui fonctionne bien et ne retourne pas cette erreur, mais a un code similaire dans un projet iOS qui renvoie cette erreur. Cela se produit lorsque je compare une valeur comptée de fibres à 5,5. La seule différence que je peux voir entre les 2 situations est que le code du terrain de jeu n'utilise pas une entrée de l'utilisateur d'un champ de texte où je convertis le texte en double. Je saisis une valeur comptée de fibres, et tout semble bien se passer.L'opérateur binaire '<' ne peut pas être appliqué à des opérandes de type 'Double?' et 'Double'

Cependant, dans le projet iOS, j'obtiens le message d'erreur ci-dessus, et je ne comprends pas comment le réparer, et surtout, pourquoi j'ai une erreur dans un jeu de codes mais pas dans l'autre. Il semble que je le ferais travailler dans les deux cas ou pas du tout. Merci d'avance.

Ce code fonctionne ok:

var ECA: Double 
var FibersCounted: Double 
var FieldsCounted: Double 
var FieldArea: Double 
var SampleVolume: Double 
var ResultNumerator: Double 
var ResultDenominator: Double 
var SampleResult: Double 
var SampleLimitofDetection: Double 

ECA = 385 
FibersCounted = 65 
FieldsCounted = 100 
FieldArea = 0.00785 
SampleVolume = 1200 

if FibersCounted <= 5.5 { 
    ResultNumerator = (ECA * (5.5/100)) 
    ResultDenominator = (FieldArea * SampleVolume * 1000) 
    SampleResult = ResultNumerator/ResultDenominator 
    } else { 
    ResultNumerator = (ECA * (FibersCounted/FieldsCounted)) 
    ResultDenominator = (FieldArea * SampleVolume * 1000) 
    SampleResult = ResultNumerator/ResultDenominator 
} 

Ce code renvoie le message d'erreur lorsque fibersCounted est comparé à 5,5 (à savoir "si fibersCounted < 5.5 {" ligne déclenche l'erreur:

@IBOutlet weak var sampleVolumeTextField: UITextField! 

    @IBOutlet weak var numberFibersCountedTextField: UITextField! 

    @IBOutlet weak var numberBlankFibersCountedTextField: UITextField! 

    @IBOutlet weak var numberFieldsCountedTextField: UITextField! 

    @IBOutlet weak var fiberDensityLabel: UILabel! 

    @IBOutlet weak var limitOfDetectionLabel: UILabel! 

    @IBOutlet weak var sampleResultLabel: UILabel! 

    @IBAction func calculatePressed(_ sender: Any) { 

     let sampleVolume = Double(sampleVolumeTextField.text!) 

     let fibersCounted = Double(numberFibersCountedTextField.text!) 

     let numberBlankFibersCounted = Double(numberBlankFibersCountedTextField.text!) 

     let fieldsCounted = Double(numberFieldsCountedTextField.text!) 

     var resultNumerator: Double 

     var resultDenominator: Double 

     var sampleResult: Double 

     var sampleLimitofDetection: Double 

     //calculate sample result based on actual fiber count or 5.5 fiber LOD value 
     if fibersCounted < 5.5 { 
      resultNumerator = (385 * (5.5/100)) 
      resultDenominator = (7.85 * sampleVolume!) 
      let sampleResult = resultNumerator/resultDenominator 
     } else { 
      resultNumerator = (385 * (fibersCounted!/fieldsCounted!)) 
      resultDenominator = (7.85 * sampleVolume!) 
      let sampleResult = resultNumerator/resultDenominator 
     } 
+0

salut tout le monde, merci beaucoup d'avoir pris le temps de lire et de répondre avec des conseils. Je vais regarder chaque réponse, puis voir ce qui fonctionne. Je reviendrai et je vous le ferai savoir. Merci encore pour toute l'aide! –

+0

ok - donc j'ai pu utiliser "si laisser ..." pour le faire fonctionner. Merci encore à tous pour votre aide. Je vais également travailler sur l'amélioration de la syntaxe d'emballage/déballage. Merci pour vos suggestions sur tout cela. –

Répondre

0

de documentation init?(_ text: String) retourner le type facultatif.Vous devez donc le déplier avant de comparer if let fibersCounted = fibersCounted, fibersCounted < 5.5 {} else {} devrait fonctionner pour vous

0

Veuillez vérifier que les valeurs sont disponibles ou non dans fieldsCounted.

if let count = fieldsCounted{ 
if count < 5.5 { 
     resultNumerator = (385 * (5.5/100)) 
     resultDenominator = (7.85 * sampleVolume!) 
     let sampleResult = resultNumerator/resultDenominator 
}else{ 
     resultNumerator = (385 * (fibersCounted!/fieldsCounted!)) 
     resultDenominator = (7.85 * sampleVolume!) 
     let sampleResult = resultNumerator/resultDenominator 
} 
} 

Merci

1

la meilleure façon comment le faire sans est de retour de liaison en option Double.nan si Double.init?(_: String) a échoué. Comme mentionné par @LeoDabus en utilisant .nan est le bon moyen Swifty et préféré.

let a = Double("1.122") ?? .nan 
let b = Double("a.123") ?? .nan 
let c = 1.123 

a < c // true 
b < c // false 
a > c // false 
b > c // false 

cela échouera toujours

b == b 

Votre code sera plus lisible et vous n'avez pas besoin la force Déballer doubles valeurs plus que vous avez fait beaucoup dans les calculs vous à venir, ce qui est potentiellement très dangereux dans un scénario d'utilisation réelle.

+1

@LeoDabus oui, vous avez absolument raison. – user3441734

0

Je suis aussi un peu novice en matière de rapidité, mais d'après son apparence, vous comparez un double optionnel à un double. Essayez if let fibersCounted = fibersCounted { with the code you want to execute } pour déplier la valeur à l'intérieur.