从 Swift 中的滑块值执行计算 2
Performing Calculations from Slider Values in Swift 2
我正在尝试实时计算 UISlider
的值,但在 Swift 2
中出现错误。这是一个简单的温度转换应用程序。有人可以看看吗?
@IBOutlet var Fahrenheit: UILabel!
@IBOutlet var Celcius: UILabel!
@IBOutlet var sliCelcius: UISlider!
@IBAction func changeTemp(sender: UISlider) {
let tempC = Int(sender.value)
let tempF = tempC *9/5+32;
Fahrenheit.text = "\(tempF)"
Celcius.text = "\(tempC)"
}
Space 运算符 '*' 丢失后,它应该可以工作
let tempF = tempC * 9/5+32
为什么 Swift 在这里会产生错误(不仅是如何避免),这可能很有趣。
与 Swift 中的许多错误消息一样,实际感兴趣的错误被其他错误消息所混淆,在本例中是有点标准的 'consecutive statments ...'
消息。然而,这里的核心错误是不存在一元(前缀)运算符 *
。 follow-up 错误,在一元前缀运算符 *
存在的情况下 ,表达式 'tempC *9/5+32'
将简化为(假设高*
一元运算符的优先级)'tempC IL/5+32'
(IL
整数文字),这自然是错误的,很像表达式 'let a: Int = 1 1'
。
现在,存在一元前缀运算符,例如+
和 -
:
/* '+' and '-' unary (prefix) operators in action: OK */
let a : Int = 1 + -1 // 0, OK
let b : Int = +(-1) // -1, OK
let c : Int = -(-(-(-(-(-(1)))))) // 1, OK
let d : Int = *1 /* error: '*' is not a prefix unary operator */
Swift 推断一个运算符是一元运算符,如果它出现在它的目标之前并且没有其他操作数出现在它之前。如果它发现紧挨着它自己的另一个操作数,它会将该运算符推断为二元运算符。举个例子:
let e: Int = 1 + 1 // binary, OK
let f: Int = 1+1 // binary, OK
let g: Int = 1 +1 /* unary prefix: resulting expression 'let g: Int = 1 1' erroneous */
let h: Int = 1+ /* + not a postfix unary operator, erroneous */
详情见Swift Language Guide - Basic Operators:
Unary operators operate on a single target (such as -a). Unary prefix
operators appear immediately before their target (such as !b), and
unary postfix operators appear immediately after their target (such as
i++).
这里的教训是要密切注意无意中以一元前缀(或后缀)方式使用运算符的表达式,以避免被来自 Swift 的混淆错误消息所混淆。
最后,请注意,我们可以自然地定义自己的前缀一元运算符,以防我们发现它们丢失
prefix operator * {}
prefix func * (rhs: Int) -> Int {
return rhs*rhs
}
let i : Int = *2 // 4, OK
我正在尝试实时计算 UISlider
的值,但在 Swift 2
中出现错误。这是一个简单的温度转换应用程序。有人可以看看吗?
@IBOutlet var Fahrenheit: UILabel!
@IBOutlet var Celcius: UILabel!
@IBOutlet var sliCelcius: UISlider!
@IBAction func changeTemp(sender: UISlider) {
let tempC = Int(sender.value)
let tempF = tempC *9/5+32;
Fahrenheit.text = "\(tempF)"
Celcius.text = "\(tempC)"
}
Space 运算符 '*' 丢失后,它应该可以工作
let tempF = tempC * 9/5+32
为什么 Swift 在这里会产生错误(不仅是如何避免),这可能很有趣。
与 Swift 中的许多错误消息一样,实际感兴趣的错误被其他错误消息所混淆,在本例中是有点标准的 'consecutive statments ...'
消息。然而,这里的核心错误是不存在一元(前缀)运算符 *
。 follow-up 错误,在一元前缀运算符 *
存在的情况下 ,表达式 'tempC *9/5+32'
将简化为(假设高*
一元运算符的优先级)'tempC IL/5+32'
(IL
整数文字),这自然是错误的,很像表达式 'let a: Int = 1 1'
。
现在,存在一元前缀运算符,例如+
和 -
:
/* '+' and '-' unary (prefix) operators in action: OK */
let a : Int = 1 + -1 // 0, OK
let b : Int = +(-1) // -1, OK
let c : Int = -(-(-(-(-(-(1)))))) // 1, OK
let d : Int = *1 /* error: '*' is not a prefix unary operator */
Swift 推断一个运算符是一元运算符,如果它出现在它的目标之前并且没有其他操作数出现在它之前。如果它发现紧挨着它自己的另一个操作数,它会将该运算符推断为二元运算符。举个例子:
let e: Int = 1 + 1 // binary, OK
let f: Int = 1+1 // binary, OK
let g: Int = 1 +1 /* unary prefix: resulting expression 'let g: Int = 1 1' erroneous */
let h: Int = 1+ /* + not a postfix unary operator, erroneous */
详情见Swift Language Guide - Basic Operators:
Unary operators operate on a single target (such as -a). Unary prefix operators appear immediately before their target (such as !b), and unary postfix operators appear immediately after their target (such as i++).
这里的教训是要密切注意无意中以一元前缀(或后缀)方式使用运算符的表达式,以避免被来自 Swift 的混淆错误消息所混淆。
最后,请注意,我们可以自然地定义自己的前缀一元运算符,以防我们发现它们丢失
prefix operator * {}
prefix func * (rhs: Int) -> Int {
return rhs*rhs
}
let i : Int = *2 // 4, OK