如果不是让 – 在Swift中

有没有办法否定“如果让”在迅速? 这对我来说很愚蠢:

if let type = json.type { } else { XCTFail("There is no type in the root element") } 

我不能使用XCTAssertNotNil,因为json.type是一个枚举。

 enum JSONDataTypes { case Object case Array case Number case String } 

非常感谢

编辑:这是一个:

 var type: JSONDataTypes? = nil 

Swift 2.0(Xcode 7)和更高版本有一个新的guard语句,就像“if not let”一样 – 你可以有条件地在封闭范围的其余部分绑定一个variables,在代码中保持“好path”最小的缩进。

 guard let type = json.type else { XCTFail("There is no type in the root element") } // do something with `type` here 

这个问题的关键在于guardelse子句必须退出这个范围(否则,在这个子句之后,就像上面的type一样,被保护的variables不被绑定)。 所以它必须以returnbreakcontinue或编译器已知的函数永远不会返回(即注释@noreturn ,就像abort()一样@noreturn ,如果包含XCTFail ,它应该( 如果不是,则提交一个bug )。

有关详细信息,请参阅Swift编程语言 提前退出 。


对于真正的老东西…在Swift 1.x中没有否定forms的if-let。 但是,既然你正在使用XCTest,你可以只testing一个断言expression式的可选部分:

 XCTAssert(json.type != nil, "There is no type in the root element") 

以下是你如何做到这一点:

 if json.type == nil { // fail } 

我已经使用了几次的另一种select:

 switch json.type { case .None: // ... case .Some(.Object): // ... case .Some(.Array): // ... case .Some(.Number): // ... case .Some(.String): // ... } 

由于? 实际上是Optional<T> ,它是一个枚举,它定义为:

 enum Optional<T> : Reflectable, NilLiteralConvertible { case None case Some(T) ... }