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

时间:2017-05-24 14:46:10

标签: ios swift binary double operators

我是Swift的新手并且通过我在此看到的答案搜索了一些,但我正在尝试找出如何纠正这个问题。我有一个Swift游乐场,代码运行正常并且不会返回此错误,但在iOS项目中有类似的代码确实会返回此错误。当我将纤维计数值与5.5进行比较时,就会发生这种情况。

我可以在两种情况之间看到的唯一区别是操场代码不使用文本字段中的用户输入,我将文本转换为Double。我输入了光纤计数值,一切似乎都没问题。

然而,在iOS项目中,我收到上面的错误消息,并且不明白如何修复它,最重要的是,为什么我在一个代码集中有错误但在另一个代码集中却没有。似乎我要么让它在两个实例中工作,要么根本不工作。提前谢谢。

此代码运行正常:

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
}

当fiberCounted与5.5比较时,此代码返回错误消息(即“如果fiberCounted&lt; 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
        }

4 个答案:

答案 0 :(得分:1)

如果没有可选绑定,如何执行此操作的最佳方法是在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 :(得分:0)

文档init?(_ text: String)中的

返回可选类型。所以你需要在比较之前解开它。 if let fibersCounted = fibersCounted, fibersCounted < 5.5 {} else {}应该适合您

答案 2 :(得分:0)

请在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
 }
}

由于

答案 3 :(得分:0)

我对快速也有点新意,但从它的外观来看,你将可选的双倍与双倍进行比较。尝试if let fibersCounted = fibersCounted { with the code you want to execute }打开里面的值。