我正在尝试构建一个简单的Swift应用来计算增值税(增值税= 20%)。
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和Double
类型的操作数
在结果行
var result = textfield * VAT
在函数内部。
答案 0 :(得分:51)
您应该将一种类型转换为另一种类型,因此两个变量应该是相同的类型:
var result: Double = Double(textfield) * VAT
答案 1 :(得分:9)
这是因为你试图将Int(文本字段)与Double(VAT)相乘。因为使用这样的操作你可能会失去双Swift的精度,不允许将一个转换为另一个,所以你需要隐式地将Int转换为Double ......
var result = Double(textfield) * VAT
答案 2 :(得分:3)
在我的情况下,它只是投射到CGFloat:
self.cnsMainFaqsViewHight.constant = CGFloat(self.mainFaqs.count) * 44.0
答案 3 :(得分:3)
这里的问题是给出的语句字面上是真的,因为Swift是强类型的,并且不会隐式强制。我自己用“二元运算符” - 也不能应用于'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
}
答案 4 :(得分:1)
你可以像转换一样 var result:Double = Double(textfield)
答案 5 :(得分: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)
答案 6 :(得分: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中一样。
一旦你意识到你的对象是一个嵌套的集合,而不是一个Ints数组,就很容易理解为什么你不能在对象上使用数字运算符。