Swift 在一个if语句中快速展开多个相互依赖的选项

Swift 在一个if语句中快速展开多个相互依赖的选项,swift,optional,Swift,Optional,我知道,您可以使用if-let语法在一行中展开多个选项,如下所示 if let x = optionalX, y = optionalY { //do something } 我想要的是在一行中展开相互依赖的多个选项。现在看起来是这样的 if let a = optionalA { if let ab = a.optionalB { if let abc = ab.optionalC { //do something }

我知道,您可以使用if-let语法在一行中展开多个选项,如下所示

if let x = optionalX, y = optionalY {
    //do something
}
我想要的是在一行中展开相互依赖的多个选项。现在看起来是这样的

if let a = optionalA {
    if let ab = a.optionalB {
        if let abc = ab.optionalC {
            //do something
        }
    }
}
在我看来,这看起来真的不干净,尤其是如果你还想要其他案例,因为你必须将其添加到每个案例中。我想要的东西看起来像这样,但它不起作用

if let a = optionalA, ab = a.optionalB {
    //do something
}
更新

以上代码确实有效


我在其他地方发生了一个错误,这使它看起来像是语句中发生的错误。

您可以这样做:

guard let a = optionalA,
      let b = a.optionalB,
      let c = b.optionalC 
else {
  // else implementation
 return
}

// do something with constants a, b and c

你可以这样做:

guard let a = optionalA,
      let b = a.optionalB,
      let c = b.optionalC 
else {
  // else implementation
 return
}

// do something with constants a, b and c

问题在于类声明,而不是可选的

classA
应该更像:

classA {
  let optionalB : B? = nil
}

问题在于类声明,而不是可选的

classA
应该更像:

classA {
  let optionalB : B? = nil
}
你可以(也许是2.3)。为了使编译器能够区分可选的展开,您需要在每个逗号后再次写入
let

if let a = optionalA,
   let ab = a.optionalB {
    // Do stuff
}
你可以(也许是2.3)。为了使编译器能够区分可选的展开,您需要在每个逗号后再次写入
let

if let a = optionalA,
   let ab = a.optionalB {
    // Do stuff
}

如果只希望使用
a
(type
a
)的(可能)实例内部变量
b
(type
b
),则可以在单个可选绑定子句中使用可选链接

class A {
    var optionalB : B?
}

class B {}

var optionalA : A?

// in case you needn't actually use optionalA, but only its
// possibly non-nil instance member `optionalB`
if let b = optionalA?.optionalB {
    //do something with b
}

如果只希望使用
a
(type
a
)的(可能)实例内部变量
b
(type
b
),则可以在单个可选绑定子句中使用可选链接

class A {
    var optionalB : B?
}

class B {}

var optionalA : A?

// in case you needn't actually use optionalA, but only its
// possibly non-nil instance member `optionalB`
if let b = optionalA?.optionalB {
    //do something with b
}

你可以做到。如果您有一些错误,请提供给我们;应该没有错误。您在测试代码中忘记了
选项B:B?
中的
var
。否则,它将按预期编译和运行。如果您更好地使用,它将显示此错误。我忘记了var,但不知何故,当我在xCode中使用更复杂的代码和在线测试时,我没有看到它。对不起,我太愚蠢了!你可以做到。如果您有一些错误,请提供给我们;应该没有错误。您在测试代码中忘记了
选项B:B?
中的
var
。否则,它将按预期编译和运行。如果您更好地使用,它将显示此错误。我忘记了var,但不知何故,当我在xCode中使用更复杂的代码和在线测试时,我没有看到它。对不起,我太愚蠢了!我最喜欢这个答案,因为它是一个很好的选择。应该注意的是,问题中的语法也适用。您在问题中使用的语法适用于Swift 2.2。Swift 3.0需要添加
let
来指定它是一个可选的展开。我最喜欢这个答案,因为它是一个不错的选择。应该注意的是,问题中的语法也适用。您在问题中使用的语法适用于Swift 2.2。Swift 3.0要求添加
let
,以指定它是可选的展开。