【问题标题】:Only else-block of "if let"?只有“如果让”的其他块?
【发布时间】:2017-07-11 05:30:51
【问题描述】:

cellForRowAtIndexPath 我有:

if let imageView = cell.viewWithTag(SOME_TAG) as? UIImageView
{
    // Nothing to do here.
}
else
{
    // Add image view to cell.
}

但我只需要 else 块。有没有办法反转if let xyz =

(我知道我可以将其拆分并拥有一个if imageView == nil。)

刚刚找到this similar question

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/a/27412931/1208191
  • 另一个好的建议是尽可能避免使用标签。它们确实污染了源代码。
  • @Sulthan 同意,但是为了将添加的子视图找回到可重用的表格视图单元格,污染最少。
  • @meaning-matters 不。将添加的子视图作为属性保存的自定义单元格更容易维护,但这将是一个冗长的讨论......

标签: swift if-statement let


【解决方案1】:

...但我只需要 else 块。有没有办法反转if let xyz =

您想知道是否可以反转可选绑定子句的逻辑,只有在可选绑定失败时才输入。但是,当有界的可选表达式(在您的情况下为cell.viewWithTag(SOME_TAG) as? UIImageView)为nil 时,就会发生这种情况。因此,对于这种逻辑,首先没有理由尝试绑定值;您只需检查可选表达式是否为nil

其他两个答案已经介绍了这样做的直接方法,但作为替代方案,您可以为.none 执行模式匹配。

if case .none = xyz {
    // implement logic ...
}

或者,应用于您的示例

if case .none = cell.viewWithTag(SOME_TAG) as? UIImageView {
    // implement logic ...
}

【讨论】:

    【解决方案2】:

    为什么不简单:

    if cell.viewWithTag(SOME_TAG) == nil {
        // Add image 
    }
    

    【讨论】:

      【解决方案3】:

      这样的?

      if cell.viewWithTag(SOME_TAG) == nil {
      
      }
      

      【讨论】:

      • 如果 cell.viewWithTag(SOME_TAG) 是不同的 UIView 而不是 UIImageView,这不会完成工作。问题是寻找转换 cell.viewWithTag 无法转换为 UIImageView 的情况
      【解决方案4】:

      你可以使用守卫。它完全符合您的需要:

      guard let x = x where x > 0 else {
              // Value requirements not met, do something
              return
          }
      

      【讨论】:

      • 很好,但对我来说这不像guard 的情况。但也许我只需要习惯它在这种情况下的使用。
      • @meaning-matters guard let _ = cell.viewWithTag(SOME_TAG) else { return }.
      • 这只是所问内容的逆逻辑,还是我遗漏了什么?
      • @Juan Curti OP 想要在 else 的情况下做一些特别的事情 - 即添加图像视图 - 对于这个 guard 在语义上不适合。 Guard 不是 if... 的对立面,它有一个非常专用的语义 - 通常在函数入口处 - 以确保正确的值并提供快速退出。虽然它可能有效,但以这种方式使用它并不常见。
      • @AndreasOetjen 当然,你是对的。这个定义非常好。我会像其他人所说的那样简单地使用 if (.. == nil)
      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 2022-01-13
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2021-12-04
      相关资源
      最近更新 更多