从 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