参见英文答案 >
Using multiple let-as within a if-statement in Swift
在Swift中,我使用if声明来检查我的对象是否不为零
在Swift中,我使用if声明来检查我的对象是否不为零
- if let obj = optionalObj
- {
- }
但有时候,如果允许声明,我必须面对连续
- if let obj = optionalObj
- {
- if let a = obj.a
- {
- if let b = a.b
- {
- // do stuff
- }
- }
- }
我正在寻找一种避免连续的方式,如果允许声明。
我会尝试像:
- if let obj = optionalObj && if let a = obj.a && if let b = a.b
- {
- // do stuff
- }
但是swift编译器不允许这样做。
任何建议?
之前我写了一些关于替代品的小文章:
https://gist.github.com/pyrtsa/77978129090f6114e9fb
在其他答案中还没有提到一种方法,我喜欢,是添加一堆重载的每个功能:
- func every<A,B>(a: A?,b: B?) -> (A,B)? {
- switch (a,b) {
- case let (.Some(a),.Some(b)): return .Some((a,b))
- default: return .None
- }
- }
- func every<A,B,C>(a: A?,b: B?,c: C?) -> (A,C)? {
- switch (a,b,c) {
- case let (.Some(a),.Some(b),.Some(c)): return .Some((a,c))
- default: return .None
- }
- }
- // and so on...
这些可以用于if语句,case表达式以及optional.map(…)链:
- // 1.
- var foo: Foo?
- if let (name,phone) = every(parsedName,parsedPhone) {
- foo = ...
- }
- // 2.
- switch every(parsedName,parsedPhone) {
- case let (name,phone): foo = ...
- default: foo = nil
- }
- // 3.
- foo = every(parsedName,parsedPhone).map{name,phone in ...}
必须为每个添加重载是模板,但只能在库中完成一次。类似地,通过使用Functor方法(即使用< ^&&>运算符),您需要以某种方式创建curried函数,这也导致一些样板。