Swift 中的单行 if 语句

Posted

技术标签:

【中文标题】Swift 中的单行 if 语句【英文标题】:Single line if statement in Swift 【发布时间】:2014-06-11 08:58:26 【问题描述】:

如何将以下内容从 Objective-C 转换为 Swift?

if (myVar) return;

Swift 没有在条件周围使用括号,但是下面的代码给出了一个错误。

if myVar return 

【问题讨论】:

与 Objective C 不同,在 Swift 中使用 if 语句时大括号是强制性的。这样做的原因是为了让代码更安全。 您必须为所有分支添加大括号,但括号是可选的(),如果您愿意,可以保留它们。 【参考方案1】:

正如其他人也解释说,大括号是 swift 中必须的。但为简单起见,您始终可以执行以下操作:

let a = -5

// if the condition is true then doThis() gets called else doThat() gets called
a >= 0 ? doThis(): doThat()

func doThis() 
    println("Do This")


func doThat() 
    println("Do That")

【讨论】:

【参考方案2】:

在 Swift 中,大括号不像在 Objective-C (C) 中那样是可选的。另一方面,括号是可选的。例子:

有效的斯威夫特:

if someCondition 
    // stuff


if (someCondition) 
    // stuff

无效的斯威夫特:

if someCondition 
    // one liner

if (someCondition)
    // one liner

这个设计决定消除了整个类的错误,这些错误可能来自不正确地使用没有大括号的 if 语句,如下例所示,可能并不总是清楚 something 的值将有条件地更改,但 @987654325 @的值每次都会改变。

Bool something = true
Bool somethingElse = true

if (anUnrelatedCondition) 
    something = false
    somethingElse = false

print something // outputs true
print somethingElse // outputs false

【讨论】:

一个广为人知的与此相关的错误示例是Apple's SSL/TLS bug,当时 Swift 正在开发中。我有时想知道这个设计决定是因为这个,还是只是巧合。这是 Swift 的一个有趣的细节,因为“类似 C”的语言强制执行编码风格是非常罕见的。 Apple 的 SSL/TLS 错误 - 并不表示单行 If 是问题所在。它清楚地表明 CMD+V 不应该使用键盘的“Key-delay”和“key-repeat”设置,并且应该只粘贴一次。尝试复制一行文本,然后按 CMD+V 比平时长一点。那是除非,开发者故意放了两个连续的“goto fail”;假设在单个 if 块中工作,以确保如果控制指针第一次不服从,则重复第二次会有所帮助。 “你还在这里吗????我已经告诉过你要失败了……马上就失败了!!!” 您不能在 if let 语句周围加上括号。【参考方案3】:

您可以使用新的 Nil-Coalescing 运算符,因为 Swift 3 以防万一您需要在 if 失败的情况下设置默认值:

let someValue = someOptional ?? ""

如果 someOptional 是 false,则此运算符将 "" 分配给 someValue

var dataDesc = (value == 7) ? "equal to 7" : "not equal to 7"

【讨论】:

【参考方案4】:

单行if、单行while 和单行for 被许多开发人员认为是不好的样式,因为它们的可读性较差并且据称是许多错误的根源。

Swift 通过禁止单行流控制语句解决了这个难题;大括号是非可选的...

if someCondition 
     // stuff

当然,你还是可以的

if someCondition  return 

还有实施原因。将条件周围的括号作为可选会使解析变得更加困难。强制大括号再次简化解析。

【讨论】:

“所谓的”是正确的。按照惯例,如始终使用 Allman 大括号和缩进,它已经是非常可以预防的。【参考方案5】:

这是我在项目中使用的一个简单解决方案。

Swift 4+

isManageCardTnCSelected ?
      (checkbox.isSelected = true) : (checkbox.isSelected = false)

var selected: Bool = isManageCardTnCSelected ?
      checkbox.isSelected = true : checkbox.isSelected = false

Swift 3+

var retunString = (state == "OFF") ? "securityOn" : "securityOff"

【讨论】:

【参考方案6】:

Swift 3+

的单线解决方案
isMyVar ? someAction() : ()

【讨论】:

【参考方案7】:

Swift 5 Easy One line 解决方案

var isSeller = (UserDefaults.standard.value(forKey: "isRole") as? String == "ROLE_SELLER") ? true : false

【讨论】:

我认为 swift 约定说不要在 if 语句上使用括号【参考方案8】:

Swift 5 简单解决方案

let exercise = (segcExercise.selectedSegmentIndex == 0) ? "GymLover" : (segcExercise.selectedSegmentIndex == 1) ? "Occasionally" : "No Way"

//MARK:- outPut   // Occasionally

【讨论】:

以上是关于Swift 中的单行 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

pb中的条件语句,if else,choose case ,for

JavaScript 单行 'if' 语句 - 最佳语法,这个替代方案? [关闭]

带有 2 个动作的单行 if 语句

单行“if”/“for”语句是好的 Python 风格吗?

如何防止空行位于单行 if 语句之间?

if else语句如何做单行? [复制]