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