Ios 如果在swift中设置布尔时速记崩溃
我实际上有4行代码Ios 如果在swift中设置布尔时速记崩溃,ios,xcode,if-statement,swift2,shorthand,Ios,Xcode,If Statement,Swift2,Shorthand,我实际上有4行代码 var bool = true let textField1 = UITextField() let textField2 = UITextField() bool ? textField1.enabled = false : textField2.enabled = false 上述代码失败,出现以下错误 如果我按照下面的方式编写代码 if bool { textField1.enabled = false } else { textfield2.
var bool = true
let textField1 = UITextField()
let textField2 = UITextField()
bool ? textField1.enabled = false : textField2.enabled = false
上述代码失败,出现以下错误
如果我按照下面的方式编写代码
if bool {
textField1.enabled = false
}
else {
textfield2.enabled = false
}
如果我用下面的方法写,那么If-else的缩写就行了
bool ? print("It's True") : print("It's False")
为什么我的代码会失败?请尝试以下操作:
bool ? (textField1.enabled = false) : (textField2.enabled = false)
请注意,三元运算符不是“if-else速记”。其定义如下:
三元条件运算符根据条件值计算为两个给定值之一。其形式如下:
状况?true时使用的表达式:false时使用的表达式
如果条件的计算结果为true,则条件运算符计算第一个表达式并返回其值。否则,它对第二个表达式求值并返回其值。不计算未使用的表达式
其目的是根据条件分配一个值,而不是允许流量控制。尝试以下操作:
bool ? (textField1.enabled = false) : (textField2.enabled = false)
请注意,三元运算符不是“if-else速记”。其定义如下:
三元条件运算符根据条件值计算为两个给定值之一。其形式如下:
状况?true时使用的表达式:false时使用的表达式
如果条件的计算结果为true,则条件运算符计算第一个表达式并返回其值。否则,它对第二个表达式求值并返回其值。不计算未使用的表达式
它的目的是根据条件分配一个值,而不是允许流量控制。原因是Swift不希望您这样做。因此,它将三元中的第二项视为
textField2.enabled
,这是一个Bool。但是第一个术语,textField1.enabled=false
,不是Bool;这是一片空白
(这就是为什么您的打印示例有效;这两个术语都是无效的。)
正如i_am_jorf所说,你可以通过用括号消除歧义来解决这个问题
然而,最好不要这样做。你的代码不是很快。您不应该以这种方式使用三元运算符来处理副作用。您应该将其用于每个术语的结果。这要干净得多,甚至更短:
(bool ? textField1 : textField2).enabled = false
原因是斯威夫特不希望你这样做。因此,它将三元中的第二项视为textField2.enabled
,这是一个Bool。但是第一个术语,textField1.enabled=false
,不是Bool;这是一片空白
(这就是为什么您的打印示例有效;这两个术语都是无效的。)
正如i_am_jorf所说,你可以通过用括号消除歧义来解决这个问题
然而,最好不要这样做。你的代码不是很快。您不应该以这种方式使用三元运算符来处理副作用。您应该将其用于每个术语的结果。这要干净得多,甚至更短:
(bool ? textField1 : textField2).enabled = false
当代码变得更可读时,您应该使用if-else语句而不是三元运算符。当代码变得更可读时,您应该使用if-else语句而不是三元运算符。非常好。实际上bool?textField1.isEnabled=false:(textField2.isEnabled=false)
就可以了。是的,我想这是因为运算符优先级计算的速度有多快?@或者它只是不希望出现这样一行不正常的代码。:)很不错的。实际上bool?textField1.isEnabled=false:(textField2.isEnabled=false)
就可以了。是的,我想这是因为运算符优先级计算的速度有多快?@或者它只是不希望出现这样一行不正常的代码。:)同样地,你的print
例子写得更好print(\(bool?:是真的):“它是假的”)
同样地,你的print
例子写得更好print(\(bool?:是真的):“它是假的”)