Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果在swift中设置布尔时速记崩溃_Ios_Xcode_If Statement_Swift2_Shorthand - Fatal编程技术网

Ios 如果在swift中设置布尔时速记崩溃

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.

我实际上有4行代码

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?:是真的):“它是假的”)