2015-05-29 80 views
32

我正嘗試構建一個簡單的Swift應用程序來計算增值稅(增值稅= 20%)。二元運算符*不能應用於Int和Double類型的操作數

class ViewController: UIViewController { 

@IBOutlet var resultTextView: UITextView! 
@IBOutlet var inputTextField: UITextField! 
@IBOutlet var calculateVATButton: UIButton! 

override func viewDidLoad() { 


    super.viewDidLoad() 


    func taxesFree(number: Int)-> Double{ 


    var textfield = self.inputTextField.text.toInt()! 
    let VAT = 0.2 
    var result = textfield * VAT 
    return result 

       } 

出於某種原因,我一直對結果行越來越

二元運算符*不能用於int類型的操作數和雙

var result = textfield * VAT 

內功能。

+0

可能重複http://stackoverflow.com/questions/29880051 /不能待應用到操作數-的型的UITextField和-INT) – nhgrif

回答

37

你應該一種類型轉換爲另一種這樣既變量應該是同一類型:

var result: Double = Double(textfield) * VAT 
+0

感謝你,幫助沒有,我收到了第二個錯誤「不能用型(()的參數列表調用的結果 - 當我返回結果 –

+0

見編輯答案。 – Greg

+5

謝謝你。這種行爲完全是不方便的。這些都是不被執行。斯威夫特制定者應停止治療開發商總愚氓。任何人都會想到1.5 * 5 = 7.5,而不是7,除非你明確地做四捨五入保持最高精度的經典方法o f操作數是要走的路。值得信賴和證明。 –

7

這是因爲你想乘一個Int(文本字段)與雙(VAT)。因爲這樣的操作可能會失去雙雨燕的精度不允許轉換一個到另一個,所以你需要隱式轉換的詮釋爲Double ...

var result = Double(textfield) * VAT 
3

在我的情況下,它是隻是鑄造CGFloat的:

self.cnsMainFaqsViewHight.constant = CGFloat(self.mainFaqs.count) * 44.0 
1

這裏的問題是,給出的說法是完全正確的,因爲雨燕是強類型並不會隱式強制。我自己用「二元運算符」 - 「'不能應用於'Date'和'Int''類型的操作數。

如果你寫:

var result = 10 * 0.2 

...這很好,但如果你寫:

var number = 10 
var result = number * 0.2 

......這不是罰款。這是因爲無類型的顯式值具有由編譯器選擇的適當類型,所以實際上第一行被認爲是var result = Double(10) * Double(0.2)。畢竟,作爲一個人,你可能意味着10是浮點或整數 - 你通常不會說哪一個,並期望從上下文中清楚。這可能有點痛苦,但強類型的想法是,在解析代碼後,它只能有一個有效的編譯表達式。

一般來說,你會使用構造函數來創建一個新的值,所以你的情況爲var result = Double(textfield) * VAT。這與鑄造(textfield as Double)不同,因爲Int不是Double的子類;你正在做的是要求在運行時建立一個全新的Double值,如果該值非常高或低,則會失去一些準確性。這就是鬆散類型的語言以很小但很重要的時間成本隱含地實現幾乎所有的即時值。

在特定情況下,是不值錢的有一個Int擺在首位所以你需要的是(即使沒有分數部分是可能的):

func taxesFree(number: Int) -> Double { 
    var textfield = Double(self.inputTextField.text)! 
    let VAT = 0.2 
    var result = textfield * VAT 
    return result 
} 
0

這爲我工作,當我在Playground中得到了同樣的錯誤信息:

func getMilk(howManyCartons: Int){ 
    print("Buy \(howManyCartons) cartons of milk") 
    let priceToPay: Float = Float(howManyCartons) * 2.35 
    print("Pay $\(priceToPay)") 
} 
getMilk(howManyCartons: 2) 
0

我在Swift中誤解了the Closed Range Operator

你應該包裹範圍的數組:[0...10]

for i in [0...10] { 
    // error: binary operator '+' cannot be applied to operands of type 'CountableClosedRange<Int>' and 'Int' 
    let i = i + 1 
} 

for i in 0...10 { 
    // ok! 
    let i = i + 1 
} 

範圍是本身可以迭代的集合。沒有必要把它包在一個陣列,也許你會在Objective-C。

一旦你意識到你的對象是一個嵌套的集合,而不是整數數組,可以很容易地看到你爲什麼不能在對象上使用數值運算符。

0

可以像 VAR結果轉換:雙=雙(文本框)

的[不能被應用於類型「的UITextField」和「INT」的操作數(
相關問題