2017-05-24 132 views
0

我是新來的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

好的 - 所以我能夠使用「如果讓......」來讓它工作。再次感謝所有人的幫助。我也將努力改進包裝/解包語法。感謝所有這些建議。 –

回答

0

從文檔init?(_ text: String)返回可選類型,因此您需要在比較之前將其解開。 if let fibersCounted = fibersCounted, fibersCounted < 5.5 {} else {}應爲您工作

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

感謝

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

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

0

我對swift有點新,但是從它的外觀來看,你正在比較一個可選的double和double。嘗試使用if let fibersCounted = fibersCounted { with the code you want to execute }解開內部的值。

相關問題