【问题标题】:Guard statement with two conditions in Swift在 Swift 中具有两个条件的 Guard 语句
【发布时间】:2019-01-14 05:27:10
【问题描述】:

我的理解是,在由逗号函数分隔的保护语句中有两个条件要求它们都为真。我可以用其中一个独立编写一个保护语句并且代码编译但是当我将它们与逗号组合时,它会给出一个错误。我的语法有什么问题吗,或者任何人都可以解释为什么它无法编译?

guard (mode != "mapme") else {  //compiles
}

guard (!annotation is MKUserLocation) else { //compiles
}

guard (mode != "mapme",!(annotation is MKUserLocation)) else { //gives error:'(Bool, Bool)' is not convertible to 'Bool'

}

【问题讨论】:

  • 检查括号!
  • 去掉外层()。一般来说,Swift 中的布尔子句不需要括号
  • 逗号分隔表达式。不能在用逗号分隔的 2 个表达式周围加上括号。

标签: swift mkannotation guard


【解决方案1】:

你用了太多无意义的括号,基本不要在简单表达式中的ifguard语句中使用括号。

发生错误是因为编译器将括号视为元组 ((Bool, Bool)),这就是错误消息的内容。

guard mode != "mapme" else {

guard !(annotation is MKUserLocation) else { // here the parentheses are useful but the `!` must be outside of the expression

guard mode != "mapme", !(annotation is MKUserLocation) else {

【讨论】:

  • 现在编译但没有给我正确的逻辑。当两个语句都为真时,我不想运行 else 代码:1) !(annotation is MKUserLocation) 即注释不是用户注释和 2) mode != "mapme" 即模式不是 mapme。如果模式是“mapme”或注释是 MKUserlocation,我想运行 else 代码。我做错了什么?
  • 其实这就是逻辑。如果mode == "mapme" annotation is MKUserLocation 则执行else 原因中的代码并保留范围,否则执行关闭} 之后的代码。
【解决方案2】:

如果你想使用括号,只需使用 && 运算符(或 || 如果你想要 OR 子句)

guard (mode != "mapme" && !(annotation is MKUserLocation)) else {

【讨论】:

    【解决方案3】:

    在 swift 中,您不需要外括号、if 语句、for 循环等等。通常认为不包含它们是一种很好的做法,在您的情况下,当您包含括号时,guard 语句将成为一个元组。所以只要把你的代码改成这个就可以了。

    guard mode != "mapme" else {  //compiles
    }
    
    guard !(annotation is MKUserLocation) else { //compiles
    }
    
    guard mode != "mapme", !(annotation is MKUserLocation) else { 
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2014-10-20
      • 2016-02-20
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多