【问题标题】:Swift unwrap multiple optionals depending on each other in one if statementSwift 在一个 if 语句中解开多个相互依赖的选项
【发布时间】:2016-08-18 08:20:27
【问题描述】:

我知道你可以使用 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
        }
    }
}

IMO 这看起来真的很不干净,特别是如果您还想要 else 案例,因为您必须将它添加到每个案例中。我想要的看起来像这样,但它不起作用

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

更新

上面的代码确实有效!

我在其他地方出现了错误,这看起来像是语句中发生了错误。

【问题讨论】:

  • 你可以这样做。如果您有一些错误 - 将其提供给我们;应该没有错误。
  • 您忘记了测试代码中optionalB : B? 中的var。否则它会按预期编译和运行。
  • 你最好使用IBM swift playground,它会显示这个错误。
  • iswift.org/playground?hWHhnR 我忘记了 var,不知何故,当我在 xCode 中使用更复杂的代码和在线尝试它时,我没有看到它。对不起愚蠢!

标签: swift optional


【解决方案1】:

如果您只想使用a(类型A)的(可能的)实例内部变量b(类型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
}

【讨论】:

  • 我最喜欢这个答案,因为它是一个不错的选择。应该注意的是,问题中的语法也有效。
  • 您在问题中使用的语法适用于 Swift 2.2。 Swift 3.0 需要添加 let 来指定它是一个可选的展开。
【解决方案2】:

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

classA 应该更像:

classA {
  let optionalB : B? = nil
}

【讨论】:

    【解决方案3】:

    你可以mix conditions and optional unwrapping separated by commas in a single if condition in Swift 3.0(也许是2.3)。为了让编译器能够区分可选的展开,您需要在每个逗号后再次写入let

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

    【讨论】:

      【解决方案4】:

      你可以这样做:

      guard let a = optionalA,
            let b = a.optionalB,
            let c = b.optionalC 
      else {
        // else implementation
       return
      }
      
      // do something with constants a, b and c
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多