【问题标题】:if else shorthand crashes on setting bool in swift如果在 swift 中设置 bool 时速记崩溃
【发布时间】:2016-09-05 03:26:22
【问题描述】:

我确实有 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")

为什么我的代码失败了?

【问题讨论】:

  • 您应该使用 if-else 语句而不是三元运算符,因为代码变得更具可读性。

标签: ios xcode if-statement swift2 shorthand


【解决方案1】:

原因是 Swift 不希望你有这样的行为。因此,它将三进制中的第二项视为textField2.enabled,它是一个布尔值。但是第一个词,textField1.enabled = false不是一个布尔值;这是一个虚空。

(这就是您的 print 示例有效的原因;两个术语都是无效的。)

正如 i_am_jorf 所说,您可以通过使用括号消除歧义来解决此问题。

但是,最好不要这样做。你的代码不是很 Swifty。您不应该以这种方式使用三元运算符来产生副作用。您应该将它用于其每个术语的结果。这更干净,甚至更短:

(bool ? textField1 : textField2).enabled = false

【讨论】:

  • 同理,print 的例子最好写成print(\(bool ? "It's true" : "It's false"))
【解决方案2】:

试试这个:

bool ? (textField1.enabled = false) : (textField2.enabled = false)

请注意,三元运算符不是“if-else 简写”。定义为:

三元条件运算符根据条件值计算出两个给定值之一。它具有以下形式:

条件?真时使用的表达式:假时使用的表达式

如果条件的计算结果为真,则条件运算符计算第一个表达式并返回其值。否则,它计算第二个表达式并返回它的值。未使用的表达式不会被计算。

它的目的是根据条件分配一个值,而不是允许流量控制。

【讨论】:

  • 非常好。其实bool ? textField1.isEnabled = false : (textField2.isEnabled = false) 可以。
  • 是的,我猜这是因为运算符优先级评估的速度有多快?
  • @Or 根本没想到会出现如此反常的代码行。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多