Swift三元运算符编译错误

Swift三元运算符编译错误,swift,Swift,为什么会产生错误,应该如何编写 let x = 5 let y = 4 var z:Int x < 4 ? z = 6 : z = 8 设x=5 设y=4 变量z:Int x

为什么会产生错误,应该如何编写

    let x = 5
    let y = 4
    var z:Int
    x < 4 ? z = 6 : z = 8
设x=5
设y=4
变量z:Int
x<4?z=6:z=8
错误是“找不到接受提供的参数的<的重载”

让x=5
设y=4
设z=x<4?6 : 8
三元运算符在那里不起作用的原因是各种中缀运算符的优先级。如果你看一下,你会发现底部的操作符通常放在较大的代码块之间。优先级越高,它对其左侧(或右侧)表达式的钳制就越紧。因此,您通常希望您的
=
运算符具有非常低的关联性,因此在以下表达式中:

let x = 2 + 3
+
将在
=
之前抓取它两侧的两个操作数,因此它解析为:

let x = (2 + 3)
而不是像:

(let x = 2) + 3
这就没什么意义了

三值条件运算符的优先级为100,而
=
运算符的优先级为90。因此,在您的示例中,当您得到以下信息时:

x < 4 ? z = 6 : z = 8
那么你如何修复它呢

x < 4 ? (z = 6) : (z = 8) // x < 4 ? z = 6 : (z = 8) works as well
x<4?(z=6):(z=8)//x<4?z=6:(z=8)也可以
括号使关联性显式。首先,为什么它是这样工作的?通常使用三元运算符将其解析为表达式(如@LeoDabus的答案所示)。在这种情况下,它的关联性意味着不需要括号:

let z = x < 4 ? 6 : 8
let z...
let z = ...
let z = x ...
let z = x < 4 // < has precedence 130, bigger than =
let z = (x < 4) ? // ? has precedence of 100, bigger than =
let z = if (x < 4) { 6 } else { 8 }
让z=x<4?6 : 8
让z。。。
让z=。。。
设z=x。。。
设z=x<4/<的优先级为130,大于=
设z=(x<4)?/?优先级为100,大于=
设z=if(x<4){6}else{8}
我希望这会有所帮助,并且有意义。(我可能把我的一些优先解释弄错了,我觉得很困惑)

事实证明,我的一些解释是错的。如果我的解释是正确的,这是行不通的:

x < 4 ? z = 6 : (z = 8)
x<4?z=6:(z=8)
但确实如此!结果表明,优先级问题发生在运算符之后,而不是之前。(我在上面再解释一下)

另外,带有大括号的实际if语句本身不会解析为表达式。所以这不起作用:

let z = if (x < 4) { 6 } else { 8 }
设z=if(x<4){6}else{8}

@LeoDabus的答案是正确的,但要明确的是,您的选项不起作用的原因是因为各种运算符的优先级。三元运算符不必解析为表达式:它也可以是语句<代码>x<4?(z=6):(z=8)将起作用,例如。@oisdk:请将您的评论转化为答案,因为这值得我投赞成票。我从未意识到三元运算可以这样使用。所有这些都是事实,但对于“应该如何编写”这个基本问题,我认为@LeoDabus有更好的答案。这是大多数人写它的方式,并且期望看到它。
let z = x < 4 ? 6 : 8
let z...
let z = ...
let z = x ...
let z = x < 4 // < has precedence 130, bigger than =
let z = (x < 4) ? // ? has precedence of 100, bigger than =
let z = if (x < 4) { 6 } else { 8 }
x < 4 ? z = 6 : (z = 8)
let z = if (x < 4) { 6 } else { 8 }