避免连续的“如果让”声明在Swift

前端之家收集整理的这篇文章主要介绍了避免连续的“如果让”声明在Swift前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Using multiple let-as within a if-statement in Swift
在Swift中,我使用if声明来检查我的对象是否不为零
  1. if let obj = optionalObj
  2. {
  3. }

但有时候,如果允许声明,我必须面对连续

  1. if let obj = optionalObj
  2. {
  3. if let a = obj.a
  4. {
  5. if let b = a.b
  6. {
  7. // do stuff
  8. }
  9. }
  10. }

我正在寻找一种避免连续的方式,如果允许声明。

我会尝试像:

  1. if let obj = optionalObj && if let a = obj.a && if let b = a.b
  2. {
  3. // do stuff
  4. }

但是swift编译器不允许这样做。

任何建议?

之前我写了一些关于替代品的小文章https://gist.github.com/pyrtsa/77978129090f6114e9fb

在其他答案中还没有提到一种方法,我喜欢,是添加一堆重载的每个功能

  1. func every<A,B>(a: A?,b: B?) -> (A,B)? {
  2. switch (a,b) {
  3. case let (.Some(a),.Some(b)): return .Some((a,b))
  4. default: return .None
  5. }
  6. }
  7.  
  8. func every<A,B,C>(a: A?,b: B?,c: C?) -> (A,C)? {
  9. switch (a,b,c) {
  10. case let (.Some(a),.Some(b),.Some(c)): return .Some((a,c))
  11. default: return .None
  12. }
  13. }
  14.  
  15. // and so on...

这些可以用于if语句,case表达式以及optional.map(…)链:

  1. // 1.
  2. var foo: Foo?
  3. if let (name,phone) = every(parsedName,parsedPhone) {
  4. foo = ...
  5. }
  6.  
  7. // 2.
  8. switch every(parsedName,parsedPhone) {
  9. case let (name,phone): foo = ...
  10. default: foo = nil
  11. }
  12.  
  13. // 3.
  14. foo = every(parsedName,parsedPhone).map{name,phone in ...}

必须为每个添加重载是模板,但只能在库中完成一次。类似地,通过使用Functor方法(即使用< ^&&>运算符),您需要以某种方式创建curried函数,这也导致一些样板。

猜你在找的Swift相关文章