二元运算符'<'不能应用于'Double?'类型的操作数。和'双'

二元运算符'<'不能应用于'Double?'类型的操作数。和'双'

问题描述:

我是新来的Swift,并通过我已经看到的答案搜索了一些,但我试图找出如何纠正这个问题。我有一个Swift游乐场,其代码运行良好,并不返回此错误,但在iOS项目中有类似的代码,它返回此错误。当我将纤维计数值与5.5进行比较时发生。二元运算符'<'不能应用于'Double?'类型的操作数。和'双'

我可以看到两种情况之间唯一的区别是操场代码没有使用来自文本字段的用户输入,我将文本转换为Double。我输入一个纤维计数值,并且全部看起来都没问题。

但是,在iOS项目中,我收到了上面的错误消息,并且不明白如何解决它,最重要的是,为什么我在一个代码集中出现错误,而不是其他错误。看来我要么让它在两种情况下工作,要么根本不工作。提前致谢。

此代码运行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 
} 

此代码返回时fibersCounted相比5.5(即, “如果fibersCounted < 5.5 {” 线触发错误的错误消息:

@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

嘿大家,非常感谢你花时间阅读和回复建议。我要看看每个答案,然后看看有什么作用。我会回来让你们都知道。再次感谢所有的帮助! –

+0

好的 - 所以我能够使用“如果让......”来让它工作。再次感谢所有人的帮助。我也将努力改进包装/解包语法。感谢所有这些建议。 –

从文档init?(_ text: String)返回可选类型,因此您需要在比较之前将其解开。 if let fibersCounted = fibersCounted, fibersCounted < 5.5 {} else {}应为您工作

请检查数值是否可用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 
} 
} 

感谢

如何做到这一点没有可选的结合最好的办法就是回到Double.nan如果Double.init?(_: String)失败。正如@LeoDabus所提到的,使用.nan是正确的Swifty方法并且是首选。

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 

这总是会失败

b == b 

您的代码会更容易阅读,因为你在你未来的计算,这是可能是非常危险做了很多你并不需要力展开双重价值了在实际的使用场景中。

+1

@LeoDabus是的,你是完全正确的。 – user3441734

我对swift有点新,但是从它的外观来看,你正在比较一个可选的double和double。尝试使用if let fibersCounted = fibersCounted { with the code you want to execute }解开内部的值。