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

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

if (myVar) return;

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

if myVar return 

【问题讨论】:

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

标签: ios objective-c swift swift3 swift4


【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多