使用"if let"与逻辑"或"运算符

JAH*_*lia 31 optional swift

我试图在if let一行中编写以下代码块:

 if let amount = datasource?.incrementForCount?(count) {

        count += amount
    }

    else if let amount = datasource?.fixedIncrement {
        count += amount
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试类似的东西:

 if let amount = datasource?.incrementForCount?(count) ||  let amount = datasource?.fixedIncrement {

        count += amount
    }
Run Code Online (Sandbox Code Playgroud)

我有一个编译时错误.

where对于这种情况,我不认为该条款是可行的.

是否可以将两个if let陈述合并为ORed一个?

Avt*_*Avt 33

尝试使用??运算符:

if let amount = datasource?.incrementForCount?(count) ?? datasource?.fixedIncrement 
{
    count += amount
}
Run Code Online (Sandbox Code Playgroud)

是否可以将2个if语句组合成单个ORed语句?

可以有几个let语句,如

if let a = optionalA, b = optionalB { ... }
Run Code Online (Sandbox Code Playgroud)

并且所有这些都应该返回非零值以通过.

但是如果你还想使用逻辑条件:

  1. 可能只是一个
  2. 应放在第一位,在任何let语句之前


The*_*Baj 11

不,你不能OR两个if-let语句,甚至是if-let一个非if-let条件的语句,因为这会完全违背if-let语句的目的.if-let确保只有在可选项成功解包到变量中时才能输入语句的主体.

let str:String? = nil
if let s = str || true {
  //s is nil, yet you're still in the if-let body
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,即使s是nil,你仍然会进入可选体,在这种情况下,你仍然需要检查s体内是否为零,使第一次if-let检查没有意义.

  • 不同意。在某些情况下,当满足条件时您需要使用可选选项,但如果不满足该条件,则不需要使用该可选选项。示例:您需要一个 ID 来初始化控制器,但根据服务器提供的内容,您可能会使用默认值。此时最好结合使用“if let”和“||”,因为初始化代码是相同的。这很方便:`if let id = model.id || model.usesDefaultValue { /*在这里初始化代码一次*/ }` 这不是:`if let id = model.id { /*在这里初始化*/ } else if model.usesDefaultValue { /*相同的 init - 代码重复*/ } ` (2认同)